引言
求解AOE网关键路径时,书上的方法为先从源点到汇点求解事件最早发生时间ve,再从汇点到源点求解事件最迟发生时间vl,再利用ve和vl求解每个活动的最早开始时间e(i)和最迟开始时间l(i),e(i)和l(i)相等的活动则为关键活动,关键活动组成的从源点到汇点的路径即为关键路径。
王道书关于求解快速路径只是简单提了一嘴 如果这是一道选择题,根据上述求ve()的过程就已经能知道关键路径
,并没有告诉你如何快速地求解关键路径,本文就此补充说明一下。
求法
这里直接举例给出求法
如下AOE图
我们从V1开始(按照拓扑序列)依次求解事件的最早发生时间ve,前三个顶点答案很显然,求得如下
v1 | v2 | v3 | v4 | v5 | |
---|---|---|---|---|---|
“事件的最早发生时间” ve() | 0 | 3 | 2 | - | - |
在求解 V 4 V4 V4 的时候,需要对两条路径进行比较,即 V e ( 4 ) = m a x { V e ( 2 ) + a 3 , V e ( 3 ) + a 5 } = m a x { 5 , 6 } = 6 Ve(4)=max\{Ve(2)+a3,Ve(3)+a5\}=max\{5,6\}=6 Ve(4)=max{Ve(2)+a3,Ve(3)+a5}=max{5,6}=6显然选取的是 a 5 a5 a5 这条路径。
这意味着
a
3
a3
a3 这条路径对
V
4
V4
V4 来讲是 “冗余的” ,或者说因为
a
5
a5
a5 的存在,它有可以改变的空间。也就是
a
3
a3
a3 一定不是关键路径。我们可以叉掉它。
同样的 (不难看出Ve(5)=3+3=6)
V
e
(
6
)
=
m
a
x
{
V
e
(
5
)
+
a
8
,
V
e
(
4
)
+
a
7
,
V
e
(
2
)
+
a
6
}
=
m
a
x
{
7
,
8
,
5
}
=
8
Ve(6)=max\{Ve(5)+a8,Ve(4)+a7,Ve(2)+a6\}=max\{7,8,5\}=8
Ve(6)=max{Ve(5)+a8,Ve(4)+a7,Ve(2)+a6}=max{7,8,5}=8
叉掉不是关键路径的
a
8
a8
a8 和
a
6
a6
a6。
按照以上思路,我们完成ve()的求解,并叉掉那些比较时被比下去的路径。
最后得到:
直观一点,我们把这些路径都去掉:
于是,我们得到关键路径
V
1
⇒
V
2
⇒
V
4
⇒
V
6
V1\Rightarrow V2\Rightarrow V4\Rightarrow V6
V1⇒V2⇒V4⇒V6
上图中,V1是源点,V6是汇点,完成工程意味着 V1到V6的一条路径,而去掉“不关键”的路径(活动边)后还可以走通的路径就是关键路径。
即上图中的(V1,V3,V4,V6)或者说(a2,a5,a7)
(注:a1和a4虽然保留在图中,但并不是关键活动,因为他们不在关键路径上)
总结
我们在求解Ve()的时候,遇到某个顶点有多个入度,需要用max比较获得最大的事件最早发生时间时,被比下去的路径可以被叉掉,选取数值最大的路径,并保留它,最终获得的就是关键路径。