xxx 关键路径算法(Critical Path Method)
字数 778 2025-10-28 22:11:24
xxx 关键路径算法(Critical Path Method)
题目描述
在带权有向无环图(DAG)中,每条边代表一个任务,边权表示任务耗时。某些任务需在其他任务完成后才能开始。求从起点到终点的最长路径(即关键路径),并确定哪些任务延迟会导致整体项目延期。
解题步骤
-
拓扑排序
- 对DAG进行拓扑排序,得到顶点线性序列,确保所有边从左向右指向。
示例:若任务A需在任务C之前完成,则序列中A必在C左侧。
- 对DAG进行拓扑排序,得到顶点线性序列,确保所有边从左向右指向。
-
计算最早开始时间(ES)
- 初始化起点的ES=0,按拓扑顺序遍历每个顶点u:
- 对u的每个邻居v,更新
ES[v] = max(ES[v], ES[u] + weight(u→v))。
- 对u的每个邻居v,更新
- 终点的ES值即为项目最短总工期。
- 初始化起点的ES=0,按拓扑顺序遍历每个顶点u:
-
计算最晚开始时间(LS)
- 初始化终点的LS=ES[终点],按逆拓扑顺序遍历每个顶点v:
- 对v的每个前驱u,更新
LS[u] = min(LS[u], LS[v] - weight(u→v))。
- 对v的每个前驱u,更新
- 确保任务不延误整体工期。
- 初始化终点的LS=ES[终点],按逆拓扑顺序遍历每个顶点v:
-
确定关键路径
- 对于边u→v,若
ES[u] + weight(u→v) = LS[v],则该边为关键任务。 - 所有关键任务构成的路径即为关键路径(可能有多条)。
- 对于边u→v,若
实例演示
假设DAG如下(边权为耗时):
A→B (3), A→C (2), B→D (4), C→D (1), D→E (5)
- 拓扑排序:A, B, C, D, E
- ES计算:
ES[A]=0 → ES[B]=3, ES[C]=2 → ES[D]=max(3+4, 2+1)=7 → ES[E]=12 - LS计算(从E倒推):
LS[E]=12 → LS[D]=7 → LS[B]=3, LS[C]=6 → LS[A]=0 - 关键边:A→B(0+3=LS[B]=3),B→D(3+4=LS[D]=7),D→E(7+5=LS[E]=12)
- 关键路径:A→B→D→E(总工期12)