拓扑排序和拓扑序
众所周知,拓扑序可以决定 dp 的顺序,而拓扑排序则是用于求图上的点的拓扑序。
对于图上任意两点
而拓扑排序则是用于求 DAG(有向无环图)的拓扑序。
思想
从小到大分配拓扑序。
对于一个节点
实现
用一个队列来维护入度为
首先把所有原图中的入度为
删除就是将所有
B3644 【模板】拓扑排序 / 家谱树
虽然这题
#include <iostream> #include <vector> #include <queue> using namespace std; int n, x, b[110]; vector<int> g[110]; queue<int> q; int main () { ios::sync_with_stdio(0), cin.tie(0); cin >> n; for (int i = 1; i <= n; i++) { while (cin >> x && x) { g[i].push_back(x), b[x]++; } } for (int i = 1; i <= n; i++) { if (!b[i]) { q.push(i); } } for (int i = 1; i <= n; i++) { x = q.front(); q.pop(); cout << x << ' '; for (int j : g[x]) { b[j]--; if (!b[j]) { q.push(j); } } } return 0; }
令
一些应用
- 拓扑序决定了 dp 的顺序,因此当要做图上 dp 时可以直接边拓扑排序边 dp。
- 给定一个有向图,可以通过拓扑排序来判环,当拓扑排序后仍有节点没有被规定拓扑序时就是有环。
本文作者:wnsyou の blog
本文链接:https://www.cnblogs.com/wnsyou-blog/p/topo_sort.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步