首页/数据结构/05-graph/关键路径 🔗 在 Obsidian 中打开
数据结构 · 05-graph

关键路径

重要度 ⭐⭐⭐⭐ 关键路径AOE网最早最迟
速查
AOE 网中从源点到汇点的最长路径为关键路径。$ve$ 正序取 max、$vl$ 逆序取 min;$e=ve(\text{弧尾})$、$l=vl(\text{弧头})-w$;e(i)=l(i) 为关键活动。O(|V|+|E|)。

核心概念

AOE 网(Activity On Edge Network):顶点 = 事件,边 = 活动(边权为持续时间),源点入度 0、汇点出度 0。从源点到汇点的最长路径 = 关键路径,其上的活动为关键活动

含义
$ve(i)$事件 $v_i$ 最早发生时间(源点到 $v_i$ 的最长路径)
$vl(i)$事件 $v_i$ 最迟发生时间(不影响工期前提下最晚)
$e(i)$活动 $a_i$ 最早开始时间(弧尾事件最早发生时间)
$l(i)$活动 $a_i$ 最迟开始时间(弧头最迟 − 持续时间)
关键活动$e(i)=l(i)$,不能延迟否则工程延期

算法步骤

  1. 求 ve(正向拓扑):$ve(j) = \max_{\langle i,j\rangle \in E}\{ ve(i)+w(i,j) \}$,源点 $ve(0)=0$。
  2. 求 vl(逆向拓扑):$vl(i) = \min_{\langle i,j\rangle \in E}\{ vl(j)-w(i,j) \}$,汇点 $vl(n-1)=ve(n-1)$。
  3. 求 e、l:设活动 $a_i$ 对应边 $\langle v_j, v_k\rangle$,$e(i)=ve(j)$,$l(i)=vl(k)-w(j,k)$。
  4. 关键活动:$e(i)=l(i)$ 者。

时间复杂度 O(|V| + |E|)。

手算示例

拓扑序列 v0,v1,v2,v3,v4,v5。$ve=[0,3,4,9,9,11]$;$vl=[0,4,4,9,10,11]$。

活动弧尾→弧头ell−e关键?
a0v0→v13011
a1v0→v24000
a2v2→v35440
a3v1→v46341
a4v1→v31385
a5v3→v52990
a6v4→v519101
结果关键活动 a1、a2、a5;关键路径 v0 → v2 → v3 → v5(工程最短工期 = 汇点 ve = 11)。

常见考法

考法①求关键路径 ②求 ve / vl ③判断关键活动(e=l)④求工程最短工期(汇点 ve)。

易错点

易错清单
  1. ve 用正向拓扑、取 max;vl 用逆向、取 min
  2. $e = ve(\text{弧尾})$:不是 ve(弧头)。
  3. $l = vl(\text{弧头}) - \text{权}$:不是 vl(弧尾)。
  4. 关键路径是最长路径,不是最短路径。

核心结论

概念计算
ve(j)max{ve(i)+w(i,j)}
vl(i)min{vl(j)−w(i,j)}
e(i)ve(弧尾)
l(i)vl(弧头) − w

关键活动:e(i)=l(i)。关键路径是源点到汇点的最长路径,决定工程最短工期。

记忆卡片

ve 如何计算?
正向拓扑:ve(j)=max{ve(i)+w(i,j)}。
vl 如何计算?
逆向拓扑:vl(i)=min{vl(j)−w(i,j)}。
如何判断关键活动?
e(i)=l(i);e=ve(弧尾)、l=vl(弧头)−w。
关键路径是最长还是最短?
最长路径,决定工程最短工期。

交互动画 · ve / vl / 关键活动

AOE 网;每点下方标 ve / vl;箭头为活动(权) a0(3) a1(4) a2(5) a3(6) a4(1) a5(2) a6(1) 0ve:– vl:– 1ve:– vl:– 2ve:– vl:– 3ve:– vl:– 4ve:– vl:– 5ve:– vl:–
AOE 网(7 活动)从源点 0 到汇点 5,求关键路径
点按钮:正序求 ve → 逆序求 vl → 判关键活动 → 显示关键路径
关键活动 a1、a2、a5(e=l);关键路径 v0→v2→v3→v5;最短工期 = ve(汇点) = 11。

相关知识点

graph-traversal minimum-spanning-tree shortest-path topological-sort graph-traversal-and-applications mst-and-shortest-path

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。