题目链接
题目大意
判断有向图是否有环
题目思路
把所有入度为0的节点删去。然后删除这个节点的所有的边。即所有和它相连的点的入度减一。然后循环。就是放在队列里,看最后是否还有入度不为0的点就行了。
代码
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e2+5;
int n,m,deg[maxn],head[maxn],cnt;
struct node{
int to,next;
}e[maxn];
void init(){
cnt=0;
memset(deg,0,sizeof(deg));
memset(head,0,sizeof(head));
memset(e,0,sizeof(e));
}
void add(int u,int v){
e[++cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt;
}
int main(){
while(scanf("%d%d",&n,&m)!=-1&&(n+m)){
init();
for(int i=1,u,v;i<=m;i++){
scanf("%d%d",&u,&v);
add(u,v);
deg[v]++;//入度加1
}
queue<int> que;
for(int i=0;i<=n-1;i++){
if(deg[i]==0){
que.push(i);
}
}
while(!que.empty()){
int x=que.front();
que.pop();
for(int i=head[x];i;i=e[i].next){
deg[e[i].to]--;
if(deg[e[i].to]==0){
que.push(e[i].to);
}
}
}
bool flag=1;
for(int i=0;i<=n-1;i++){
if(deg[i]!=0){
flag=0;
break;
}
}
if(flag){
printf("YES\n");
}else{
printf("NO\n");
}
}
return 0;
}