题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3342
#include <cstdio>
#include <cstring>
#include <queue>
#define MAXN 102
using namespace std;
queue<int> Q;
int mp[MAXN][MAXN],indegree[MAXN],n;
int topusort()
{
int i,j,t,x,tot=0;
while (!Q.empty())
{
Q.pop();
}
for(i=0;i<n;++i)
{
for(j=0;j<n;++j)
if(mp[i][j])
indegree[j]++;
}
for(i=0;i<n;++i)
{
if(!indegree[i])
Q.push(i);
}
while(!Q.empty())
{
x=Q.front();
Q.pop();
tot++;
for(j=0;j<n;++j)
{
if(mp[x][j])
{
indegree[j]--;
if(!indegree[j])
Q.push(j);
}
}
}
if(tot==n)
return 1;
else
return 0;
}
int main()
{
int m,i,x,y,ans;
while(scanf("%d %d",&n,&m)&&n)
{
memset(mp,0,sizeof(mp));
memset(indegree,0,sizeof(indegree));
for(i=0;i<m;++i)
{
scanf("%d %d",&x,&y);
mp[x][y]=1;
}
ans=topusort();
if(ans)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}