所谓”拓扑排序“,就是指将一个有向无环图G的所有顶点排成一个线性序列,使得有向无环图G的 边集中的任意一条边<u,v>,始终满足u出现在v的前面。
所以实现拓扑排序其实非常简单,只需要找到入度为0的节点。然后删除与之相连的边,更新入度即可,直到所有点都被遍历过即可。
来道板子题
hdu 1285
// Problem: 确定比赛名次
// Contest: HDOJ
// URL: http://acm.hdu.edu.cn/showproblem.php?pid=1285
// Memory Limit: 65 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
using namespace std;
const int N = 505;
int g[N][N];
int in[N], out[N];
void topsort(int n)
{
int k = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (!in[j])
{
k = j;
out[i] = j;
in[j]--;
break;
}
}
for (int j = 1; j <= n; j++)
{
if (g[k][j] == 1)
{
g[k][j] = 0;
in[j]--;
}
}
}
}
int main()
{
int n, m;
while (cin >> n >> m)
{
memset(g, 0, sizeof(g));
memset(in, 0, sizeof(in));
while (m--)
{
int x, y;
cin >> x >> y;
if (g[x][y])
continue;
g[x][y] = 1;
in[y]++;
}
topsort(n);
for (int i = 1; i <= n; i++)
{
if (i == n)
printf("%d\n", out[i]);
else
printf("%d ", out[i]);
}
}
}
本文介绍拓扑排序的概念,即如何将有向无环图的所有顶点排列成线性序列,满足边的顺序。通过寻找入度为0的节点,不断删除边并更新入度,直至遍历所有节点。给出了一个拓扑排序的实例,用于解决HDOJ的确定比赛名次问题,展示了一种实际应用拓扑排序的方法。
8716

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



