题目链接
采用书上的DFS进行排序,书上遗留问题说为什么在访问一个节点后把它加到当前拓扑排序的首部原因是当进行递归的时候采用的栈而栈是先进后出的结构。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 500;
int n, m, a, t, b;
int G[maxn][maxn];
int d[maxn],top[maxn];
bool dfs(int u)
{
d[u] = -1;//为-1时表示节点正在被访问
for (int v = 1; v <= n; v++)
{
if (G[u][v])
{
if (d[v] < 0) //如果v节点也正在被访问说明有环 不是DAG(有向无环图)
return false;
else if (!d[v])
dfs(v);
}
}
d[u] = 1;//等于1说明已经被访问过了
top[t--] = u;//出栈
return true;
}
bool topsort()
{
for (int u = 1; u <= n; u++)
{
if (!d[u])
{
if (!dfs(u))
return false;
}
}
return true;
}
int main()
{
while (scanf("%d%d", &n, &m)&&n)
{
memset(d, 0, sizeof(d));
memset(G, 0, sizeof(G));
for (int i = 1; i <= m; i++)
{
scanf("%d%d", &a, &b);
G[a][b] = 1;
}
t = n;
if (topsort())
{
for (int i = 1; i < n; i++)
{
printf("%d ", top[i]);
}
printf("%d\n", top[n]);
}
}
}