拓扑排序判断有向环的题目,对于判环的题,判无向环一般用并查集,判有向环一般用拓扑排序
#include <bits/stdc++.h>
using namespace std;
int main(){
int v,e,in[105],x,y;
vector<int> adjl[105];
bool vis[105];
while(cin>>v>>e,v!=0){
memset(adjl,0,sizeof(adjl));
memset(vis,0,sizeof(vis));
memset(in,0,sizeof(in));
for(int i=0;i<e;i++){
cin >> x >>y;
in[y]++;
adjl[x].push_back(y);
}
int cnt = v;
queue<int> q;
for(int i=0;i<v;i++){
if(in[i] ==0){
q.push(i);
vis[i] = true;
}
}
while(!q.empty()){
int tmp = q.front();
q.pop();
cnt--;
for(int i=0;i<adjl[tmp].size();i++){
int kk =adjl[tmp][i];
in[kk]--;
if(in[kk]==0&&!vis[kk]){
q.push(kk);
vis[kk] = true;
}
}
}
// while(!q.empty()){
// int vt=q.front();
// // cout<<vt<<endl;
// q.pop();cnt--;
// for(int i=0;i<adjl[vt].size();i++)
// {
// int vv=adjl[vt][i];
// in[vv]--;
// if(!vis[vv]&&in[vv]==0)
// {
// q.push(vv);
// vis[vv]=true;
// }
// }
// }
if(cnt == 0)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}