注意在计数的时候在队列里边。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define ll __int64
using namespace std;
int head[20010],cnt,du[20010],p[20010];
struct node
{
int to,next;
}q[20010];
int main()
{
int n,m,i,j,k;
while(~scanf("%d%d",&n,&m))
{
int a,b;
cnt=1;
memset(du,0,sizeof(du));
memset(head,-1,sizeof(head));
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
q[i].to=b;
q[i].next=head[a];
head[a]=cnt++;
du[b]++;
}
queue<int>qu;
int s=0;
for(i=1;i<=n;i++)
if(!du[i])
qu.push(i);
while(!qu.empty())
{
int t=qu.front();
qu.pop();
s++;
for(k=head[t];k!=-1;k=q[k].next)
{
du[q[k].to ]--;
if(!du[q[k].to] )
{
qu.push(q[k].to);
}
}
}
if(s==n)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}