题目链接:Leagal or Not
题目要求就是判断是不是有环,我们可以通过每次从队列取出一个就 +1 直到队列为空,此时如果取出元素的个数 == N
就说明没有环;如果 != N 就表示有环
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
struct Node{
int from;
int to;
int ne;
}e[1000];
int n,m,x,y,cnt;
int in[1000],head[1000];
void init()
{
memset(head,-1,sizeof(head));
memset(in,0,sizeof(in));
cnt = 0;
}
void add(int u,int v)
{
e[cnt].to = v;
e[cnt].ne = head[u];
head[u] = cnt ++;
}
int main()
{
while(scanf("%d%d",&n,&m),n)
{
queue<int>q;
init();
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
add(x+1,y+1);//把从 0 ~ n-1 改成从 1 ~ n
in[y+1] ++;
}
for(int i=1;i<=n;i++)
{
if(in[i] == 0)
{
q.push(i);
}
}
int sum = 0;
while(!q.empty())
{
int k = q.front();
q.pop();
sum ++;
for(int i=head[k];~i;i=e[i].ne)
{
in[e[i].to] --;
if(in[e[i].to] == 0)
{
q.push(e[i].to);
}
}
}
if(sum == n)
{
cout<<"YES"<<endl;
}
else {
cout<<"NO"<<endl;
}
}
return 0;
}