题意:
判断是否有环存在
思路
拓补排序
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int in[105];
int out[105];
int head[105];
struct node
{
int u,v,next;
}edge[10005];
int cnt=0;
int yes;
void add(int x,int y)
{
edge[++cnt].u=x;
edge[cnt].v=y;
edge[cnt].next=head[x];
head[x]=cnt;
}
int n,m;
void solve(int u)
{
for(int i=head[u];i!=-1;i=edge[i].next)
{
in[ edge[i].v ]--;
yes=1;
}
head[u]=-1;
return ;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
cnt=0;
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
memset(edge,0,sizeof(edge));
memset(head,-1,sizeof(head));
for(int k=1;k<=m;k++)
{
int u,v;
scanf("%d%d",&u,&v);
add(v,u);
in[u]++;
}
while(1)
{
yes=0;
for(int i=1;i<=n;i++)
{
if(in[i]==0)
{
solve(i);
}
}
if(!yes)
break;
}
yes=1;
for(int i=1;i<=n;i++)
{
if(in[i]!=0)
{
yes=0;
break;
}
}
if(yes)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}