拓扑排序
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int maxn = 100 + 5;
vector<int> G[maxn];
int deg[maxn];
int n;
vector<int> ans;
int main(int argc, char const *argv[]) {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
int x;
while (scanf("%d", &x) == 1 && x) {
G[i].push_back(x);
deg[x]++;
}
}
queue<int> q;
for (int i = 1; i <= n; i++) {
if (deg[i] == 0) {
q.push(i);
}
}
while (!q.empty()) {
int v = q.front();
q.pop();
ans.push_back(v);
for (int i = 0; i < G[v].size(); i++) {
int u = G[v][i];
if (--deg[u] == 0) {
q.push(u);
}
}
}
for (int i = 0; i < ans.size(); i++) {
if (i) {
putchar(' ');
}
printf("%d", ans[i]);
}
putchar('\n');
return 0;
}
本文介绍了一种基于图论的拓扑排序算法实现方法。通过使用邻接表表示有向图,并采用队列辅助实现,该算法能有效地解决课程安排等实际问题。文章通过示例代码展示了如何初始化图结构、读取输入以及进行拓扑排序。
325

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



