题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3342
题意:根据给出的边来判断是不是拓扑序列或者说是否有环出现。
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
#define maxn 10005
vector<int> g[maxn];
int indegree[maxn], n, m, cnt;
int main()
{
while (~scanf("%d%d", &n, &m) && n)
{
memset(indegree, 0, sizeof(indegree));
for (int i=0; i<n; ++i)
g[i].clear();//这里忘了wa好多次
for (int i=0; i<m; ++i)
{
int a, b;
scanf("%d%d", &a, &b);
g[a].push_back(b);
indegree[b] ++;
}
queue<int> q;
for (int i=0; i<n; ++i)
{
if (!indegree[i])
q.push(i);
}
while (!q.empty())
{
int temp = q.front();
q.pop();
for (int i=0; i<g[temp].size(); ++i)
{
indegree[g[temp][i]] --;
if (!indegree[g[temp][i]])
q.push(g[temp][i]);
}
}
int flag = 1;
for (int i=0; i<n; ++i)
{
if (indegree[i]>0)
{
flag = 0;
break;
}
}
printf("%s\n", flag?"YES":"NO");
}
return 0;
}