内容整理来源:zzu信息工程学院数据结构课件
本文将介绍以下几个概念:
- DAG图
- 拓扑排序
- 关键路径
1 DAG图
DAG(Directed Acyclic Graph)图,即有向无环图,常常用来描述工程和系统的进行过程。比如:
- 工程能否顺利进行(有向图的拓扑排序问题)
- 估算工程完成必须的最短时间(有向图的关键路径问题)
对于DAG图来说,我们首先需要掌握判断一个图是否有环的方法:
1.1 无向图
- DFS
- BFS
对一个无向图来说,若在遍历过程中(BFS或DFS)遇到回边,则必定存在环。
“回边”:即 指向已经访问过的顶点 的边。
1.2 有向图
- DFS
- 对有向图进行拓扑排序,若网中所有顶点都在它的拓扑有序序列中,则不存在环
强调一点:
有向图DFS时,并不是遇到回边就存在环,比如反例:a->b
, a->c->b
。那么有向图的DFS怎样判断是否有环呢?方法如下:
还有一种判断方法就是拓扑排序,下面介绍拓扑排序。
2 拓扑排序
关于拓扑排序的引入,可以参考:拓扑排序
2.1 概念和术语
或者引用维基百科的定义:
在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(英语:Topological sorting)。
- 每个顶点出现且只出现一次;
- 若A在序列中排在B的前面,则在图中不存在从B到A的路径。
也可以定义为:拓扑排序是对有向无环图的顶点的一种排序,它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面。即:拓扑排序就是对一个有向图构造拓扑序列的过程。
2.2 拓扑排序的步骤
2.3 拓扑排序举例
最经典的例子就是先修课例子了。
拓扑有序序列不唯一,给出一个答案:
C1
→ C3
→ C2
→ C4
→ C6
→ C5
→ C7
2.4 拓扑排序算法分析
- 拓扑排序算法的时间复杂度为
O(n+e)
- 拓扑排序算法是求关键路径的基础
3 关键路径
3.1 术语
首先注意:顶点是事件,弧是活动。可以把事件理解为一个状态,活动理解为一个过程。
在上图中,解释一下为什么关键路径是从源点到汇点路径长度最长的路径:
一个项目要实现,必须做完图中的所有事件,那么只要最长路径上的事件都做完了,那么其他的也一定都做完了。所以这条最长路径就称为关键路径。
-----------------------------------------------------分割线--------------------------------------------------------------
在看下图之前,要注意区分以下几点:
- 活动、事件
- 最早开始时间、最迟开始时间
问题来了,怎样理解这个最早和最迟呢,其实很简单。
最早意思就是:前面耗时最长的做完了,你才能开始,这就是你的最早开始时间
最迟意思就是:你干活耗时比较少,所以你可以早早干完休息,直到耗时最长的做完。但是你也可以先休息一会儿,然后再去干活,同时保证你不能托节奏。这就是你的最迟开始时间。
最后,约定以下术语,并在下图中给出对应的计算方法。
设活动ai
在有向边<j,k>
上,则:
e(i)
:活动ai
的最早开始时间l(i)
:活动ai
的最迟开始时间Ve(k)
:事件vk
的最早发生时间Vl(j)
:事件vj
的最迟开始时间
3.2 求关键活动
举个例子:
因为活动的两个开始时间都依赖事件,所以先看事件。
我的答案:
1.各事件的最早(正着写)和最迟开始时间(倒着写)
Ve(i)
:0、6、4、5、7、7、16、14、18
Vl(i)
:0、6、6、8、7、10、16、14、18
2.各活动的最早和最迟开始时间
e(i)
:0、0、0、6、4、5、7、7、7、16、14
l(i)
:0、2、3、6、6、8、7、7、10、16、14
差:0、-2、-3、0、-2、-3、0、0、-3、0、0
即:a1、a4、a7、a8、a10、a11
3.关键路径:
- (V1 ,V2, V5, V7, V9)
- (V1 ,V2 ,V5 ,V8 ,V9)
3.3 关键路径总结
- 影响关键活动的因素是多方面的,任何一项活动持续时间的改变都会影响关键路径的改变
- 关键活动的速度提高是有限度的,只有在不改变网的关键路径的情况下,提高关键活动的速度才有效
- 关键路径可有多条
- 若网中有几条关键路径,则单提高某一条关键路径上的关键活动的速度并不能导致整个工程缩短工期,必须提高同时在几条关键路径上的活动的速度才能使整个工程缩短工期