快速找到关键路径

如图,求图中关键路径长度和经过的节点

p1

首先源点 1 的事件最早发生时间为 0,然后按照拓扑排序的顺序,对于每一个节点 i,它的事件最早发生时间 D(i) = max{D(pre) + weight(pre, i)},即对于节点 i 的每个前驱节点 pre,计算 pre 的事件最早发生时间 + 有向边 <pre, i> 的权,取其中的最大值,即为节点 i 的事件最早发生时间,对应的 pre 即为节点 i 在关键路径中的前驱,如果有多个相等的前驱,那说明图中有多条关键路径。计算到终点后,沿着记录的前驱就能逆向写出所有关键路径。

对于上图,求解过程如下:

节点 事件最早发生时间 前驱
1 0
2 5 1
3 6 1
4 9 3
5 12 3 / 4
6 16 5
7 14 5
8 13 4
9 19 7
10 21 9

p1

逆向写出关键路径:

1 -> 3 -> 4 -> 5 -> 7 -> 9 -> 10

1 -> 3 -> 5 -> 7 -> 9 -> 10