题目链接:
题目: 给一个有向图,判断是否成环
思路: 拓扑排序裸题,在排序过程中统计入度点0的点数,若所有点入度均为0,则不存在环
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
int head[105],indegree[105],n,m,tot;
struct node
{
int v,nxt;
}edge[105];
void add(int u,int v)
{
edge[tot].v=v;
edge[tot].nxt=head[u];
head[u]=tot++;
}
void topo_sort()
{
priority_queue<int,vector<int>,greater<int> >que;
for(int i=0;i<n;i++)
if(indegree[i]==0)
{
que.push(i);
}
int cnt=0;
while(que.size())
{
int t=que.top();
que.pop();
cnt++;
for(int i=head[t];i!=-1;i=edge[i].nxt)
{
int v=edge[i].v;
if(indegree[v])
{
indegree[v]--;
if(indegree[v]==0)
que.push(v);
}
}
}
if(cnt==n)
printf("YES\n");
else printf("NO\n");
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
memset(indegree,0,sizeof indegree);
memset(head,-1,sizeof head);
tot=0;
int x,y;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
indegree[y]++;
}
topo_sort();
}
return 0;
}