基本拓扑排序,判断有无环路即可
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 105
bool map[MAX][MAX];
int in[MAX];
int toposort(int n)
{
for(int i=0;i<n;i++)
{
int j;
for(j=0;j<n;j++)
if(!in[j])
break;
if(j==n)
return 0;
in[j]--;
for(int k=0;k<n;k++)
in[k]-=map[j][k];
}
return 1;
}
void solve(int n,int m)
{
memset(map,0,sizeof(map));
memset(in,0,sizeof(in));
int u,v;
for(int i=0;i<m;i++)
{
cin>>u>>v;
if(!map[u][v])
{
in[v]++;
map[u][v]=1;
}
}
if(toposort(n))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
int main()
{
int n,m;
while(cin>>n>>m,n||m)
solve(n,m);
}