题意:判断图中是否有环存在
思路:简单的拓扑排序
将有关系的点,加一个有向边,然后记录出入度,先找入度为0的点,将和他联系的点入度-1,再找入度为0的直到没有点为止,判断点是否全访问过,如果是说明不存在环,如果不是就说明有环存在
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
int map[105][105];
int num[105];
int sum ;
void topsort(int n)
{
int i;
queue<int> q;
for(i = 0; i < n; i++)
{
if(!num[i])
q.push(i);
}
while(!q.empty())
{
int t = q.front();sum--;q.pop();
for(i = 0; i < n; i++)
{
if(map[t][i])
{
num[i]--;
if(!num[i])
q.push(i);
}
}
}
if(sum > 0)
printf("NO\n");
else
printf("YES\n");
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m) != EOF)
{
int i,a,b;
sum = n;
if(n == 0 && m == 0)
break;
memset(num,0,sizeof(num));
memset(map,0,sizeof(map));
for(i = 0; i < m; i++)
{
scanf("%d%d",&a,&b);
if(!map[a][b])
{
map[a][b] = 1;
num[b]++;
}
}
topsort(n);
}
return 0;
}