拓扑排序与关键路径
关键路径是第 6 章唯一一个「四个参量、五个步骤」的固定流程题,也是本章综合题的主力。
它的难点不在思想,在四个量的定义方向相反:
机制
AOV 网与拓扑排序
AOV 网:用顶点表示活动、用有向边表示活动之间先后关系的有向无环图(DAG)。
拓扑排序:
- 从 AOV 网中选择一个**没有前驱(入度为 0)**的顶点并输出。
- 从网中删除该顶点和所有以它为起点的有向边。
- 重复 ① 和 ②,直到当前的 AOV 网为空,或当前网中不存在无前驱的顶点为止(后一种情况说明有向图中必然存在环)。
逆拓扑排序(教材单列,关键路径要用):
- 从 AOV 网中选择一个**没有后继(出度为 0)**的顶点并输出。
- 从网中删除该顶点和所有以它为终点的有向边。
- 重复 ① 和 ②,直到当前的 AOV 网为空。
时间复杂度:采用邻接表
拓扑排序的三条注意
教材列的三条,第 2 条是高频考点:
1)入度为零的顶点,即没有前驱活动的或前驱活动都已经完成的顶点,工程可以从这个顶点所代表的活动开始或继续。
2)拓扑排序的结果可能不唯一。
不少人误认为「AOV 网的各顶点为线性序列」是拓扑序列唯一的充要条件,而它其实只是充分非必要条件。 拓扑序列是否唯一的判断条件是:在每次输出顶点时,检测入度为 0 的顶点是否唯一,若每次都唯一,则说明拓扑序列唯一。
3) AOV 网中各顶点的地位平等,每个顶点编号是人为的,因此可以按拓扑排序的结果重新编号,生成 AOV 网的新的邻接存储矩阵,这种邻接矩阵可以是三角矩阵;但对于一般的图来说,若其邻接矩阵是三角矩阵,则存在拓扑序列;反之则不一定成立。
边界辨析:
第 3 条的两个方向要分开记:
- 邻接矩阵是三角矩阵
存在拓扑序列(成立); - 存在拓扑序列
邻接矩阵是三角矩阵(不一定,因为顶点编号是人为的,没重新编号时矩阵可以不是三角)。 这是 2011、2024 两年「拓扑排序序列的存在性和唯一性分析」的直接考点。
有向无环图描述表达式
DAG 可以用来描述含公共子式的表达式:把重复出现的子表达式合并成同一个顶点,从而共享。做法是从叶结点(操作数)开始自底向上归并相同的子树。
考法固定:给一个表达式,问「用 DAG 描述至少需要多少个顶点」。答案 = 去重后的不同子表达式个数(含操作数)。
AOE 网
在带权有向图中,以顶点表示事件,以有向边表示活动,以边上的权值表示完成该活动的开销(如完成活动所需的时间),称之为用边表示活动的网络,简称 AOE 网。
AOE 网和 AOV 网都是有向无环图,不同之处在于它们的边和顶点所代表的含义是不同的: AOE 网中的边有权值;而 AOV 网中的边无权值,仅表示顶点之间的前后关系。
AOE 网具有以下两个性质:
- 只有在某顶点所代表的事件发生后,从该顶点出发的各有向边所代表的活动才能开始;
- 只有在进入某顶点的各有向边所代表的活动都已结束时,该顶点所代表的事件才能发生。
在 AOE 网中仅有一个入度为 0 的顶点,称为开始顶点(源点),它表示整个工程的开始;也仅有一个出度为 0 的顶点,称为结束顶点(汇点),它表示整个工程的结束。
关键路径
在 AOE 网中,有些活动是可以并行进行的。从源点到汇点的有向路径可能有多条,并且这些路径长度可能不同。完成不同路径上的活动所需的时间虽然不同,但是只有所有路径上的活动都已完成,整个工程才能算结束。
因此,从源点到汇点的所有路径中,具有最大路径长度的路径称为关键路径,而把关键路径上的活动称为关键活动。
完成整个工程的最短时间就是关键路径的长度,即关键路径上各活动花费开销的总和。这是因为关键活动影响了整个工程的时间,即若关键活动不能按时完成,则整个工程的完成时间就会延长。
边界辨析:
「最短完成时间 = 最长路径长度」这个看似矛盾的表述,是关键路径全部的直觉。 因为所有路径上的活动必须全部完成,所以工程的耗时由最慢的那条路决定—— 这与 计组全书的第 ⑥ 条隐线「要整齐就得按最慢的来」 是同一个道理。
四个参量
1. 事件
其中
教材注意框:计算
值时,按从前往后的顺序进行,可以在拓扑排序的基础上计算: ① 初始时,令 ; ② 输出一个入度为 0 的顶点 时,计算它所有直接后继顶点 的最早发生时间,若 ,则 。以此类推,直至输出全部顶点。
2. 事件
其中
教材注意框:计算
值时,按从后往前的顺序进行,可以在逆拓扑排序的基础上计算。 增设一个栈以记录拓扑序列,拓扑排序结束后从栈顶至栈底便为逆拓扑有序序列。 ① 初始时,令 ; ② 栈顶顶点 出栈,计算其所有直接前驱顶点 的最迟发生时间,若 ,则 。
3. 活动
4. 活动
5. 差额
flowchart TD S1["① 从源点出发,令 vₑ(源点)=0<br/>按<b>拓扑有序</b>求其余顶点的 vₑ()<br/><b>取 Max,从前往后</b>"] S2["② 从汇点出发,令 v_l(汇点)=vₑ(汇点)<br/>按<b>逆拓扑有序</b>求其余顶点的 v_l()<br/><b>取 Min,从后往前</b>"] S3["③ 由各顶点的 vₑ() 求所有弧的<br/>最早开始时间 e()<br/><b>e(i) = vₑ(弧的起点)</b>"] S4["④ 由各顶点的 v_l() 求所有弧的<br/>最迟开始时间 l()<br/><b>l(i) = v_l(弧的终点) − 权值</b>"] S5["⑤ 求所有活动的差额 d() = l() − e()<br/><b>找出所有 d()=0 的活动</b><br/>构成关键路径"] S1 --> S2 --> S3 --> S4 --> S5 classDef fwd fill:#e3f2fd,stroke:#1565c0,stroke-width:2px classDef bwd fill:#ffe0b2,stroke:#e65100,stroke-width:2px classDef fin fill:#c8e6c9,stroke:#1b5e20,stroke-width:2px class S1,S3 fwd class S2,S4 bwd class S5 fin
蓝色的两步向前算,橙色的两步向后算。 这是这道题唯一需要记的结构。
手算模板
拓扑排序:
- 列出所有顶点的入度。
- 每轮:选一个入度为 0 的顶点输出,把它的出边全删,相关顶点入度减 1。
- 若某轮有多个入度为 0 的顶点 → 拓扑序列不唯一(按题目规定的次序选,通常是编号最小)。
关键路径(照五步走,画一张四列表):
| 活动 |
|---|
- 先算
:源点为 0,按拓扑序从前往后,每个顶点取「所有前驱的 + 边权」的最大值。 - 再算
:汇点 ,按逆拓扑序从后往前,每个顶点取「所有后继的 − 边权」的最小值。 - 逐条边填上表的四列。
的边就是关键活动,把它们串起来就是关键路径。 - 验算:关键路径长度
,且关键路径上每个顶点都满足 。
边界
| 说法 | 判断 | 说明 |
|---|---|---|
| 「拓扑序列唯一 | ❌ | 只是充分非必要条件;判据是每次入度为 0 的顶点是否唯一 |
| 「有拓扑序列则邻接矩阵是三角矩阵」 | ❌ | 反之才成立;这个方向不一定 |
| 「AOV 网的边有权值」 | ❌ | AOV 边无权,仅表示前后关系;AOE 边有权 |
| 「AOE 网可以有多个源点」 | ❌ | 仅有一个入度为 0 的顶点和一个出度为 0 的顶点 |
| 「关键路径是最短路径」 | ❌ | 是最长路径;但它等于工程的最短完成时间 |
| 「关键路径唯一」 | ❌ | 可能有多条, |
| 「加快任一关键活动都能缩短工期」 | ❌ | 若有多条关键路径,必须同时缩短所有关键路径上的公共活动才有效 |
| 「 | ❌ | 取 Max(最长路径); |
| 「 | ❌ | 是起点的 |
| 「 | ❌ | 是 |
| 「 | ⚠️ | |
| 「 | ❌ | 用逆拓扑序,且要用栈记录 |
口径差异:
算竞里拓扑排序就是 Kahn 或 DFS 后序,从不关心序列是否唯一; 「关键路径」这个词在算竞里根本不出现——那就是 DAG 上的最长路 DP,一遍 DP 就完了, 不会分成
/ / / / 五个量。 408 要的正是这五个量的表。 直接用最长路 DP 算出答案,能得到关键路径, 但答不出「活动
的时间余量是多少」——而那恰恰是分值所在。 另外「拓扑序列是否唯一」这个问法在算竞里几乎不存在,408 考了两年(2011、2024)。
对照速查
| AOV 网 | AOE 网 | |
|---|---|---|
| 顶点表示 | 活动 | 事件 |
| 边表示 | 活动之间的前后关系 | 活动 |
| 边有无权 | 无权 | 有权(开销) |
| 都是 | 有向无环图 | 有向无环图 |
| 典型问题 | 拓扑排序 | 关键路径 |
| 量 | 方向 | 取 | 公式 |
|---|---|---|---|
| 从前往后(拓扑序) | Max | ||
| 从后往前(逆拓扑序) | Min | ||
| — | — | ||
| — | — | ||
| — | — |
| 复杂度 | 值 |
|---|---|
| 拓扑排序(邻接表) | |
| 拓扑排序(邻接矩阵) | |
| 关键路径 | 与拓扑排序同阶 |
考点
- 拓扑排序序列的存在性和唯一性分析(2011、2024 命题追踪)——唯一性判据。
- 邻接矩阵为三角矩阵与拓扑序列的单向蕴涵关系。
- AOV 与 AOE 的三点差别(顶点含义、边含义、边有无权)。
- 关键路径的性质(2020 命题追踪):最长路径 = 最短完成时间。
- 求关键路径的实例(2019、2022 命题追踪)——五步流程 + 四列表。
- 四个参量的方向:
取 Max 向前, 取 Min 向后。 - 关键路径可能不唯一,缩短工期要看公共活动。
链接
- 🏠 返回总览:数据结构第 6 章:图总览
- ⬅️ 上一节:6.4.1~6.4.2 最小生成树与最短路径
- 🔗 拓扑排序基于入度:6.1.1 度、入度和出度
- 🔗 遍历与判环:6.3 图的遍历
- 🔗 「按最慢的来」这条隐线:计组全书地图
- 📖 名词库:第 6 章名词库