图(拓扑排序和关键路径)

一:何谓“拓扑排序”?
假设以有向图表示一个工程的施工图或程序的数据流图(AOV网),则图中不允许出现回路。
检查有向图中是否存在回路的方法之一,是对有向图进行拓扑排序。
对有向图进行如下操作:
按照有向图给出的次序关系,将图中顶点排成一个线性序列,对于有向图中没有限定次序关系的顶点,则可以人为加上任意的次序关系。由此所得顶点的线性序列称之为拓扑有序序列。
二:如何进行拓扑排序?
一、从有向图中选取一个没有前驱
        的顶点,并输出之;

二、从有向图中删去此顶点以及所
        有以它为尾的弧;
重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。

拓扑排序算法
图(拓扑排序和关键路径)_第1张图片

总是删除入度为 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才
发生。
整个工程完成的时间为 :从有向图的 源点 汇点 的最长路径。
例如:
 
图(拓扑排序和关键路径)_第2张图片
关键活动 指的是 :该弧上的 权值增加 将使有向图上的 最长路径的长度增加。
从源点到各个顶点,以至从源点到汇点的有向 路径可能不止一条。这些路径的长度也可能不 同。完成不同路径的活动所需的时间虽然不 同,但只有各条路径上所有活动都完成了,整 个工程才算完成。
因此,完成整个工程所需的时间取决于从源点 到汇点的最长路径长度,即在这条路径上所有 活动的持续时间之和。这条路径长度最长的路 径就叫做 关键路径 (Critical Path)
要找出关键路径,必须找出 关键活动 ,即不按期完成就会影响整个工程完成的活动。关键路径上的所有活动都是关键活动。因此,只要找到了关键活动,就可以找到关键路径
三:关键路径具体算法如下:
图(拓扑排序和关键路径)_第3张图片
 
图(拓扑排序和关键路径)_第4张图片
图(拓扑排序和关键路径)_第5张图片
图(拓扑排序和关键路径)_第6张图片
算法的实现要点 :
显然,求 ve 的顺序应该是 按拓扑有序 次序
 
而求 vl 的顺序应该是拓扑有序序列的逆序列即 扑逆序 次序
因此,应该在拓扑排序的过程中,另设一个 记下拓扑有序序列。
      在拓扑排序求 Ve[i] 和逆拓扑有序求 Vl[i] , 需时间为   O(n+e) 求各个活动的 e[k] l[k] 时所需 时间为 O(e) , 共花费时间仍然是 O(n+e)
 
 

 

你可能感兴趣的:(数据结构(c语言版))