实现:1,没有前驱的结点输出 2 从图中删除该顶点和所有出边 重复1,2直至所有顶点都输出。或不存在无前驱的顶点,后者代表有向图是有环的。(有向图判环)
#include<cstdio>
#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
const int maxn=110;
vector<int>grid[maxn];
int indu[maxn];
bool find(int N){
int sum=0;
queue<int>Q;
for(int i=0;i<N;i++)if(indu[i]==0)Q.push(i);
while(!Q.empty()){
int now=Q.front();Q.pop();
sum++;
for(int i=0;i<grid[now].size();i++){
int next=grid[now][i];
if(--indu[next]==0)Q.push(next);
}
}
if(sum==N)return true;
else return false;
}
int main(){
int N,M;
while(scanf("%d%d",&N,&M)==2 &&N){
for(int i=0;i<N;i++)grid[i].clear();
memset(indu,0,sizeof(indu));
while(M--){
int u,v;
scanf("%d%d",&u,&v);
grid[u].push_back(v);
indu[v]++;
}
if(find(N))printf("YES\n");
else printf("NO\n");
}
return 0;
}