1、所有in=0的都拿出去了,但vis还不全为0,则一定有环
拓扑排序:用邻接表存储比较方便
1、找到一个入度为0的点,删除它,它的所有后继结点入度-1
2、重复1知道没有入度为0的点存在,这时所有删除的顶点构成一个全序关系。
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
using namespace std;
vector<int> q[110];
int in[110],vis[110],n,m;
int topo()
{
int i,j,flag,k,l,tmp;
memset(vis ,0,sizeof vis);
for(i=0;i<n;i++)
{
flag=0;
for(j=0;j<n;j++)
{
if(!vis[j])
{
flag=1;
if(!in[j])
{
flag=2;
k=j;
break;
}
}
}
if(flag==1) return 0;//没有入度为0的点了
if(flag==0) return 1;
vis[k]=1;
l=q[k].size();
for(j=0;j<l;j++)
{
tmp=q[k][j];
//if(vis[q[k][j]]) return 0;//有环根本就到不了这来啊。。
in[tmp]--;
}
}
}
int main()
{
int u,v,i;
while(scanf("%d%d",&n,&m)&&n)
{
for(i=0;i<110;i++)
q[i].clear();
memset(in,0,sizeof in);
while(m--)
{
scanf("%d%d",&u,&v);
q[u].push_back(v);
in[v]++;
}
if(topo()) printf("YES\n");
else printf("NO\n");
}
return 0;
}