题意:
现在有一张有向图,边只会从下标比较小的点指向下表比较大的点,并且每个点最多只有2条出边。
让你删掉不超过
个点,使得里面没有一条长度超过1的路径。
题解:
为什么是4/7,是因为,在一棵满二叉树中,删掉最下面一行,占比是4/7
那么我们只需要从小到大枚举每个点,然后枚举每个儿子,让儿子的深度与它的深度+1模3取一个最大值,如果某个数的深度是2,那么就要删除。当然会出现这种情况:
这种时候是不是删掉了4个值,当然不是,
此时3的深度为2,然后接下来的点又重新开始,所以删掉的绝对要更少。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
vector<int>vec[N];
int dep[N];
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
vec[i].clear(),dep[i]=0;
int x,y;
for(int i=1;i<=m;i++)
scanf("%d%d",&x,&y),vec[x].push_back(y);
for(int i=1;i<=n;i++)
for(int j:vec[i])
dep[j]=max(dep[j],(dep[i]+1)%3);
int ans=0;
for(int i=1;i<=n;i++)
if(dep[i]==2)
ans++;
printf("%d\n",ans);
for(int i=1;i<=n;i++)
if(dep[i]==2)
printf("%d ",i);
printf("\n");
}
return 0;
}