一:何谓“拓扑排序”?
假设以有向图表示一个工程的施工图或程序的数据流图(AOV网),则图中不允许出现回路。
检查有向图中是否存在回路的方法之一,是对有向图进行拓扑排序。
对有向图进行如下操作:
按照有向图给出的次序关系,将图中顶点排成一个线性序列,对于有向图中没有限定次序关系的顶点,则可以人为加上任意的次序关系。由此所得顶点的线性序列称之为拓扑有序序列。
二:如何进行拓扑排序?
一、从有向图中选取一个没有前驱
的顶点,并输出之;
二、从有向图中删去此顶点以及所
有以它为尾的弧;
重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。
拓扑排序算法
总是删除入度为
0
的顶点并输出之。
注意:拓扑排序的结果不一定是唯一的。
2.2 关键路径
问题:
假设以有向网表示一个施工流图,弧上的权
值表示完成该项子工程所需时间。
问:哪些子工程项是
“
关键工程
”
?
即:哪些子工程项将影响整个工程的完成期
限的。
用边表示活动的网络
(AOE
网络
)
l
如果在
无有向环的带权有向图
中
•
用有向边表示一个工程中的各项活动
(Activity)
•
用边上的权值表示活动的持续时间
(Duration)
•
用顶点表示事件
(Event)
则这样的有向图叫做用边表示活动的网络,简
称
AOE (Activity On Edges)
网络。
AOE网络在某些工程估算方面非常有用。例如,可以使人们了解:
(1) 完成整个工程至少需要多少时间
(2) 为缩短完成工程所需的时间, 应当加快哪些活动?
AOE 网(活动在边上),边代表活动或任务,顶点代
表事件。
l
在AOE网络中, 有些活动顺序进行,有些活
动并行进行
l
事件i发生后,其后继活动a(i,*)都可以开始
只有所有先导活动a(*,j)都结束后,事件j才
发生。
整个工程完成的时间为
:从有向图的
源点
到
汇点
的最长路径。
例如:
“
关键活动
”
指的是
:该弧上的
权值增加
将使有向图上的
最长路径的长度增加。
从源点到各个顶点,以至从源点到汇点的有向
路径可能不止一条。这些路径的长度也可能不
同。完成不同路径的活动所需的时间虽然不
同,但只有各条路径上所有活动都完成了,整
个工程才算完成。
因此,完成整个工程所需的时间取决于从源点
到汇点的最长路径长度,即在这条路径上所有
活动的持续时间之和。这条路径长度最长的路
径就叫做
关键路径
(Critical Path)
。
要找出关键路径,必须找出
关键活动
,即不按期完成就会影响整个工程完成的活动。关键路径上的所有活动都是关键活动。因此,只要找到了关键活动,就可以找到关键路径
三:关键路径具体算法如下:
算法的实现要点
:
显然,求
ve
的顺序应该是
按拓扑有序
的
次序
;
而求
vl
的顺序应该是拓扑有序序列的逆序列即
拓
扑逆序
的
次序
;
因此,应该在拓扑排序的过程中,另设一个
“
栈
”
记下拓扑有序序列。
在拓扑排序求
Ve[i]
和逆拓扑有序求
Vl[i]
时
,
所
需时间为
O(n+e)
,
求各个活动的
e[k]
和
l[k]
时所需
时间为
O(e)
,
总
共花费时间仍然是
O(n+e)
。