拓扑排序
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=1002;
vector<int>G[maxn];
int Din[maxn]={0};
int n,m;
int ans[maxn];
priority_queue<int,vector<int>,greater<int> >q;
int main(){
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){
int a,b;
scanf("%d %d",&a,&b);
G[a].push_back(b);
Din[b]++;
}
for(int i=0;i<n;i++){
if(Din[i]==0)q.push(i);
}
int cnt=0;
while(q.size()){
int x=q.top();
q.pop();
ans[cnt]=x;
cnt++;
for(int i=0;i<G[x].size();i++){
Din[G[x][i]]--;
if(Din[G[x][i]]==0)q.push(G[x][i]);
}
}
if(cnt==n){
printf("YES\n");
for(int i=0;i<cnt;i++){
printf("%d",ans[i]);
if(i!=cnt-1)printf(" ");
else printf("\n");
}
}else printf("NO\n%d\n",n-cnt);
return 0;
}