查看“︁11-图论/04-拓扑排序”︁的源代码
←
11-图论/04-拓扑排序
跳转到导航
跳转到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
== 拓扑排序 == 拓扑排序只适用于'''有向无环图(DAG)''',将顶点排序成线性序列,使得每条边 <math>u \to v</math> 中 <math>u</math> 排在 <math>v</math> 前面。 === 应用场景 === * 课程先修关系(A 是 B 的先修课) * 编译依赖顺序 * 任务调度 === BFS 实现(Kahn 算法) === 每次选入度为 <math>0</math> 的点输出并删除: <syntaxhighlight lang="cpp"> vector<int> g[MAXN]; int indeg[MAXN]; // 入度 vector<int> topo_sort(int n) { vector<int> res; queue<int> q; for (int i = 1; i <= n; i++) if (indeg[i] == 0) q.push(i); while (!q.empty()) { int u = q.front(); q.pop(); res.push_back(u); for (int v : g[u]) { indeg[v]--; if (indeg[v] == 0) q.push(v); } } // 若 res.size() < n,说明图中有环 return res; } </syntaxhighlight> === DFS 实现 === 后序遍历的逆序即为拓扑序: <syntaxhighlight lang="cpp"> vector<int> g[MAXN]; bool vis[MAXN], on_path[MAXN]; vector<int> topo; bool dfs(int u) { vis[u] = true; on_path[u] = true; for (int v : g[u]) { if (!vis[v]) { if (!dfs(v)) return false; } else if (on_path[v]) return false; // 有环 } on_path[u] = false; topo.push_back(u); return true; } // 调用 for (int i = 1; i <= n; i++) if (!vis[i]) dfs(i); reverse(topo.begin(), topo.end()); // 逆序即为拓扑序 </syntaxhighlight> [[Category:图论]] [[Category:三三文档]]
返回
11-图论/04-拓扑排序
。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
工具
链入页面
相关更改
页面信息