步骤摘要:
-
计算每个点的入度。
-
入度为 0 就加入队列。
-
当队列不为空则循环:
-
取出队首元素并输出。
-
遍历队首元素的连边,对应节点的入度 −1。
-
当对应的节点入度为 0 就加入队列。
-
代码内容:
#include <iostream>
#include <queue>
using namespace std;
struct edge
{
int to;
int next;
};
int head[100005];
edge graph[100005];
int d[100005];
int n, m;
queue<int> que;
int main()
{
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
int s, e;
cin >> s >> e;
graph[i].next = head[s];
graph[i].to = e;
head[s] = i;
d[e]++;
}
for (int i = 1; i <= n; i++)
{
if (d[i] == 0)
{
que.push(i);
}
}
int cnt = n;
while (!que.empty())
{
int now = que.front();
que.pop();
cnt--;
cout << now << " ";
for (int i = head[now]; i != 0; i = graph[i].next)
{
d[graph[i].to]--;
if (d[graph[i].to] == 0)
{
que.push(graph[i].to);
}
}
}
cout << endl;
if (cnt)
{
cout << "Circle!" << endl;
}
}