每個點最多兩個出邊。
我們讓第3*x層的點全部刪去。
假設第一層V1,第二層V2,第三層V3
V3<=2*V2<=4*v1
V1+V2+V3>=7/4* V3
4/7 * n >=V3
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 2e5+7;
int head[M],cnt=1;
void init(){cnt=1,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,w;}ee[M*2];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
int f[M];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
cnt=1;
for(int i=1;i<=n;i++)head[i]=f[i]=0;
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
add(u,v,1);
}
vector<int>v;
for(int x=1;x<=n;x++)
{
// cout<<"-- "<<x<<" "<<f[x]<<endl;
if(f[x]>=2)
{
v.pb(x);
continue;
}
for(int i=head[x];i;i=ee[i].nxt)
{
int y=ee[i].to;
f[y]+=f[x]+1;
}
}
cout<<v.size()<<endl;
for(int i=0;i<v.size();i++)
cout<<v[i]<<" ";
cout<<endl;
}
return 0;
}