首页/数据结构/05-graph/拓扑排序的应用 🔗 在 Obsidian 中打开
数据结构 · 05-graph

拓扑排序的应用

难度 ★★重要度 ★★ 考查频率 低题型 选择 / 综合应用 数据结构/图拓扑排序DAG408
速查
拓扑排序是对 DAG 排成线性序列使边从前指向后;仅 DAG 可行,失败 ⟺ 有环;可用于检测环、课程安排、求关键路径等。

速查

项目
主题拓扑排序的应用
核心概念DAG 所有顶点排成线性序列,使任意边 $\langle u,v\rangle$ 中 $u$ 在 $v$ 之前
时间复杂度$O(|V|+|E|)$
难度⭐⭐
重要性⭐⭐

核心概念

定义

拓扑排序是对有向无环图(DAG)的所有顶点排成一个线性序列,使得图中任意一条边 $\langle u,v\rangle$,$u$ 在序列中都出现在 $v$ 之前。

关键性质
  • 只有 DAG 才有拓扑排序
  • DAG 的拓扑排序不一定唯一
  • 如果图中有环,则不存在拓扑排序
  • 拓扑排序可用于检测环

算法步骤(Kahn 算法 / 入度表法)

1. 计算所有顶点的入度
2. 将所有入度为 0 的顶点入队(或栈)
3. 循环:
   a. 取出一个入度为 0 的顶点 v,加入结果序列
   b. 删除 v 的所有出边(即 v 的每个邻接点入度减 1)
   c. 若某邻接点入度变为 0,入队
4. 若结果序列包含所有顶点 → 排序成功
   若结果序列顶点数 < 总顶点数 → 图中有环

DFS 实现思路

对每个未访问顶点进行 DFS:
1. 先递归访问所有后继
2. 当前顶点访问完毕后入栈
3. 最终栈的逆序即为拓扑排序
(后序遍历的逆序 = 拓扑排序)

手算示例

例题 1:基础拓扑排序

顶点 A~F,边 A→C, A→D, B→D, B→E, C→F, D→F, E→F。

顶点入边入度
A0
B0
CA→C1
DA→D, B→D2
EB→E1
FC→F, D→F, E→F3

拓扑排序结果:A, B, C, D, E, F(不唯一,取决于入队顺序)。

例题 2:检测环

边 A→B, B→C, C→A, C→D。所有顶点入度均为 1,没有任何入度为 0 的顶点,无法开始 ⟹ 图中有环(A→B→C→A)

例题 3:课程安排问题

先修关系:C3 需先修 C1;C4 需先修 C1、C2;C5 需先修 C3、C4;C6 需先修 C5。

等价 DAG:C1→C3, C1→C4, C2→C4, C3→C5, C4→C5, C5→C6。

入度:$C1=0, C2=0, C3=1, C4=2, C5=2, C6=1$。一种合法选课顺序:C1 → C2 → C3 → C4 → C5 → C6

例题 4:关键路径中的应用

  1. 拓扑排序确定事件最早发生时间 $ve$(正向遍历)
  2. 逆拓扑序确定事件最迟发生时间 $vl$(逆向遍历)
  3. 关键活动:$e(i) = l(i)$ 的活动

408 考试要点

要点 1手动模拟 Kahn 算法:最常考,画表格计算入度变化。
要点 2判断有向图是否有环:拓扑排序结果顶点数 < 总数则有环。
要点 3拓扑排序结果的唯一性:若每一步都只有一个入度为 0 的顶点,则排序唯一。
要点 4AOE 网与关键路径:拓扑排序是关键路径算法的基础。
要点 5DFS 法:后序遍历的逆序,选择题常考。

记忆卡片

拓扑排序的必要条件?
图必须是有向无环图(DAG);有环的图不存在拓扑排序。
Kahn 算法如何检测环?
输出顶点数 < 图的总顶点数,说明剩余顶点入度均不为 0(形成环)。
拓扑序列唯一吗?何时唯一?
不一定唯一;当且仅当每一步队列中只有一个入度为 0 的顶点时唯一。
DFS 法拓扑排序的核心思想?
对 DAG 做 DFS 后序遍历,结果逆序即为拓扑排序。
n 个顶点 DAG 最多几条边?
$n(n-1)/2$ 条(此时拓扑排序唯一,只有一种全序)。
拓扑排序在关键路径中的作用?
正向求事件最早发生时间 $ve$,逆拓扑求最迟发生时间 $vl$。

交互动画 · Kahn 课程安排(C1~C6)

选课顺序:每步移除入度为 0 的课程(节点下方数字 = 当前入度) C10 C20 C31 C42 C52 C61
点击「播放」观察选课顺序的生成
入度:C1=0, C2=0, C3=1, C4=2, C5=2, C6=1

相关知识点

(暂无关联知识点)

↑ 本页右上「在 Obsidian 中打开」跳回源笔记。