传送门:HihoCoder1435 Circle Detect
题目描述
测试样例
Sample Input
2
5 5
1 2
2 3
4 5
5 4
4 2
3 2
1 2
2 3
Sample Output
YES
NO
题目大意
给定一个N个结点,M条边的有向图,问是否存在环。
解题思路
有向图判环,拓扑排序。如果通过拓扑排序,N个点入度全部清零,则无环,否则有环。
AC代码
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int MAXN=1e5+5;
int in[MAXN];
vector<int> edge[MAXN];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
in[y]++;
edge[x].push_back(y);
}
queue<int> q;
for(int i=1;i<=n;i++)
if(in[i]==0)
q.push(i);
int ans=0;
while(!q.empty())
{
int temp=q.front();
q.pop();
ans++;
for(int i=0;i<edge[temp].size();i++)
{
int t=edge[temp][i];
in[t]--;
if(in[t]==0)
q.push(t);
}
}
if(ans==n)
puts("NO");
else
puts("YES");
memset(in,0,sizeof(in));
for(int i=0;i<MAXN;i++)
edge[i].clear();
}
return 0;
}