图论-拓扑排序与关键路径
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图论算法
四、拓扑排序算法与关键路径
,都是在有向无今天讨论的所有算法,
今天讨论的所有算法
环图中才适用的。
1.拓扑排序
AOV(Activity On Vertex Network)顶点活动网络。
所谓AOV网,就是指一个有向无环图。
我们可以把一个AOV网形象地看成是一个大任务的进行流程。
其中的子任务有一定的先后关系,必须完成一个,或某几个子任务后,才能接着完成接下来的任务。
因此,找出子任务的完成顺序就显得很有意义。
显然把每一个任务的前驱任务都放在这个任务之前,就是所有任务的完成顺序。
这样的顺序就叫做“拓扑序列”。
注意,拓扑序列是不唯一的。
构造拓扑序列的拓扑排序算法思想很简单:
1)选择一个入度为0的顶点并输出
2)然后从AOV网中删除此顶点及以此顶点为起点的所有关联边;
3)重复上述两步,直到不存在入度为0的顶点为止。
4)若输出的顶点数小于AOV网中的顶点数,则输出“有回路信息”,否则输出的顶点序列就是一种拓扑序列。
从第四步可以看出,拓扑排序可以用来判断一个有向图是否有环。
只有有向无环图才存在拓扑序列。
算法实现:
a)数据结构:indgr[i]:顶点i的入度;
stack[]:栈
b)初始化:top=0(栈顶指针)
c)将初始状态所有入度为0的顶点压栈
d)I=0(计数器)
e)While栈非空(top>0)do
i.顶点v出栈;输出v;计数器增1;
ii.For与v邻接的顶点u do
1.dec(indgr[u]);
2.If indgr[u]=0then顶点u入栈
f)EXIT(I=|V|)
简单&高效&实用的算法。
上述实现方法复杂度O(V+E)关键路径
2.2.关键路径
如果我们已经得到了完成任务的顺序,即拓扑序列,接下来我们最关心的问题显然是完成所有的任务最少需要多长时间。
假设工程可以同时进行。
我们开始时可以人为添加2个结点,0和n+1,表示任务开始和任务全部完成。
因为所有的任务都必须完成,根据木桶原理,耗时最长的那条路显然应是完成所有任务的最少耗时。
因为先完成的任务必须等待后完成的任务才能继续下面的任务。
可以使用动态规划计算到达每一个点的耗时。
1)先对所有任务进行拓扑排序
2)time[0]=0;
3)time[i]=max{time[j]+w[j,i],0<=j<i}(j是i所有的前驱任务,w[j,i]是从j到i的耗时,如果给出的时点i的耗费,可以把所有指向i的边的耗费设为点i的耗费。
)。