#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
const int maxn = 100;
int n, m, vis[maxn + 10], pr[maxn + 10], cnt;
vector<int> G[maxn + 5];
bool dfs(int u) {
vis[u] = -1;
for (vector<int>::iterator i = G[u].begin(); i != G[u].end(); i++) {
if (vis[*i] == -1)
return false;
else if (!vis[*i] && !dfs(*i))
return false;
}
vis[u] = 1;
pr[cnt--] = u;
return true;
}
bool toposort() {
memset(vis, 0, sizeof(vis));
for (int u = 1; u <= n; u++) {
if (!vis[u]) {
if (!dfs(u)) return false;
}
}
return true;
}
int main()
{
while (~scanf("%d%d", &n, &m) && (n || m)) {
for (int i = 1; i <= n; i++) G[i].clear();
for (int i = 0; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
G[u].push_back(v);
}
cnt = n;
if (toposort()) {
for (int i = 1; i <= n; i++) {
printf(i == 1 ? "%d" : " %d", pr[i]);
}
puts("");
}
}
return 0;
}

本文介绍了一种使用深度优先搜索实现的拓扑排序算法,并通过一个C++代码示例展示了如何为有向无环图(DAG)进行排序。该算法首先通过DFS遍历图中的每个节点,并标记节点的状态来检测环的存在。如果图中存在环,则无法完成拓扑排序。若成功遍历所有节点且未发现环,则输出节点的逆后序遍历结果作为拓扑排序的顺序。
402

被折叠的 条评论
为什么被折叠?



