收藏 分享(赏)

拓扑排序-关键路径-最短路径.ppt

上传人:11xg27ws 文档编号:8604890 上传时间:2019-07-05 格式:PPT 页数:70 大小:1.34MB
下载 相关 举报
拓扑排序-关键路径-最短路径.ppt_第1页
第1页 / 共70页
拓扑排序-关键路径-最短路径.ppt_第2页
第2页 / 共70页
拓扑排序-关键路径-最短路径.ppt_第3页
第3页 / 共70页
拓扑排序-关键路径-最短路径.ppt_第4页
第4页 / 共70页
拓扑排序-关键路径-最短路径.ppt_第5页
第5页 / 共70页
点击查看更多>>
资源描述

1、有向无环图及其应用,要点: 拓扑排序 关键路径,有向无环图: 一个无环的有向图,简称DAG图。 DAG图:描述含有公共子式的表达式及工程或系统的进行过程时的有效工具。 活动:一个较大的工程被划分成许多子工程,这些子工程被称作活动。活动之间,存在某种约束,如:某些子工程的开始必须在另外一些子工程完成之后。 关心问题:1.工程能否顺利进行2.估算 整个工程完成所必须的最短时间,有向无环图及其应用 拓扑排序 问题提出:学生选修课程问题 顶点表示课程 有向弧表示先决条件,若课程i是j的先决条件,则图中有弧 学生应按怎样的顺序学习这些课程,才能无矛盾、顺利地完成学业拓扑排序定义 AOV网用顶点表示活动,

2、用弧表示活动间优先关系的有向图称为顶点表示活动的网(Activity On Vertex network),简称AOV网 若是图中有向边,则vi是vj的直接前驱;vj是vi的直接后继 AOV网中不允许有回路,这意味着某项活动以自己为先决条件,拓扑排序把AOV网络中各顶点按照它们相互之间的优先关系排列成一个线性序列的过程叫检测AOV网中是否存在环方法:对有向图构造其顶点的拓扑有序序列,若网中所有顶点都在它的拓扑有序序列中,则该AOV网必定不存在环拓扑排序的方法 在有向图中选一个没有前驱的顶点且输出之 从图中删除该顶点和所有以它为尾的弧 重复上述两步,直至全部顶点均已输出;或者当图中不存在无前驱的

3、顶点为止,拓扑序列:C1-C2-C3-C4-C5-C7-C9-C10-C11-C6-C12-C8 或 :C9-C10-C11-C6-C1-C12-C4-C2-C3-C5-C7-C8,一个AOV网的拓扑序列不是唯一的,算法实现 以邻接表作存储结构 设置一个包含n个元素的一维数组indegree,保存AOV网中每个顶点的入度值。 把邻接表中所有入度为0的顶点进栈 栈非空时,输出栈顶元素Vj并退栈;在邻接表中查找Vj的直接后继Vk,把Vk的入度减1,即indegreek-1;若Vk的入度为0则进栈 重复上述操作直至栈空为止。若栈空时输出的顶点个数不是n,则有向图有环;否则,拓扑排序完毕,算法描述,1

4、,6,输出序列:6,输出序列:6,输出序列:6,输出序列:6,输出序列:6,输出序列:6,输出序列:6 1,输出序列:6 1,输出序列:6 1,4,输出序列:6 1,4,输出序列:6 1,4,输出序列:6 1,4,3,输出序列:6 1,4,3,输出序列:6 1,4,3,输出序列:6 1,4,3,输出序列:6 1,4,3,输出序列:6 1 3,4,3,输出序列:6 1 3,4,输出序列:6 1 3,4,输出序列:6 1 3,4,输出序列:6 1 3,4,2,输出序列:6 1 3,4,2,输出序列:6 1 3,4,2,输出序列:6 1 3 2,4,2,输出序列:6 1 3 2,4,输出序列:6 1

5、 3 2 4,4,输出序列:6 1 3 2 4,输出序列:6 1 3 2 4,5,输出序列:6 1 3 2 4,5,输出序列:6 1 3 2 4 5,5,输出序列:6 1 3 2 4 5,算法分析,建邻接表:T(n)=O(e) 搜索入度为0的顶点的时间:T(n)=O(n) 拓扑排序:T(n)=O(n+e),关键路径 问题提出,把工程计划表示为有向图,用顶点表示事件,弧表示活动; 每个事件表示在它之前的活动已完成,在它之后的活动可以开始,例 设一个工程有11项活动,9个事件 事件 V1表示整个工程开始 事件V9表示整个工程结束 问题:(1)完成整项工程至少需要多少时间?(2)哪些活动是影响工程进

6、度的关键?,定义 AOE网(Activity On Edge)也叫边表示活动的网。AOE网是一个带权的有向无环图,其中顶点表示事件,弧表示活动,权表示活动持续时间 路径长度路径上各活动持续时间之和 关键路径路径长度最长的路径叫 Ve(j)表示事件Vj的最早发生时间 Vl(j)表示事件Vj的最迟发生时间 e(i)表示活动ai的最早开始时间 l(i)表示活动ai的最迟开始时间 l(i)-e(i)表示完成活动ai的时间余量 关键活动关键路径上的活动叫,即l(i)=e(i)的活动,问题分析 如何找e(i)=l(i)的关键活动?,设活动ai用弧表示,其持续时间记为:dut() 则有:(1)e(i)=Ve

7、(j)(2)l(i)=Vl(k)-dut(),如何求Ve(j)和Vl(j)?,(1)从Ve(1)=0开始递推,(2)从Vl(n)=Ve(n)开始递推,求关键路径步骤 求Ve(i) 求Vl(j) 求e(i) 求l(i) 计算l(i)-e(i),V1 V2 V3 V4 V5 V6 V7 V8 V9,0 6 4 5 7 7 16 14 18,0 6 6 8 7 10 16 14 18,a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11, ,算法实现 以邻接表作存储结构 从源点V1出发,令Ve1=0,按拓扑序列求各顶点的Vei 从汇点Vn出发,令Vln=Ven,按逆拓扑序列求其余各顶

8、点的Vli 根据各顶点的Ve和Vl值,计算每条弧的ei和li,找出ei=li的关键活动,算法描述 1-输入顶点和弧信息,建立其邻接表计算每个顶点的入度2-对其进行拓扑排序 2.1-排序过程中求顶点的Vei2.2-将得到的拓扑序列进栈3-按逆拓扑序列求顶点的Vli4-计算每条弧的ei和li,找出ei=li的关键活动,Status TopologicalOrder(ALGraph G, Stack / TopologicalOrder,Status CriticalPath(ALGraph G) / 算法7.14, G为有向网,输出G的各项关键活动。Stack T; int a,j,k,el,ee

9、,dut; char tag; ArcNode *p;if (!TopologicalOrder(G, T) return ERROR; for(a=0; anextarc) k=p-adjvex; dut=p-info; /dutif (vlk-dut nextarc) k=p-adjvex;dut=p-info; ee = vej; el = vlk-dut;tag = (ee=el) ? * : ;printf(j, k, dut, ee, el, tag); / 输出关键活动return OK; / CriticalPath,对图示的AOE 网络,计算各活动弧的e(ai)和l(ai)的

10、函数值,各事件(顶点)的ve(Vj)和vl (Vj)的函数值,列出各条关键路径。,最短路径,所谓最短路径问题是指:如果从图中某一顶点(称为源点)出发到达另一顶点(称为终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边的权值总和达到最小。 1.单源点最短路径2.所有顶点对之间的最短路径,单源点最短路径,给定带权有向图G和源点v, 求从v到G中其余各顶点的最短路径。,V5,V0,V2,V4,V1,V3,100,30,10,60,10,20,50,5,V0,V2,V4,V3,V5,V0,始点 终点 Di 最短路径,V1 V2 V3 V4 V5, 10 30 100, 10 30 100,

11、10 60 30 100, 10 60 30 100, 10 50 30 100,(V0, V2)(V0, V4) (V0, V5),(V0, V2)(V0, V4) (V0, V5),(V0, V2) (V0, V2, V3) (V0, V4) (V0, V5),(V0, V2) (V0, V2, V3) (V0, V4) (V0, V5),(V0, V2) (V0, V4, V3) (V0, V4) (V0, V5), 10 50 30 90,(V0, V2) (V0, V4, V3) (V0, V4) (V0, V4, V5), 10 50 30 90,(V0, V2) (V0, V4,

12、 V3) (V0, V4) (V0, V4, V5), 10 50 30 60,(V0, V2) (V0, V4, V3) (V0, V4) (V0, V4, V3, V5), 10 50 30 60,(V0, V2) (V0, V4, V3) (V0, V4) (V0, V4, V3, V5),如何在计算机中求得最短路径?,Dijkstra提出了一个按路径“长度”递增的次序,逐步得到由给定源点到图的其余各点间的最短路径的算法: 假设我们以邻接矩阵cost表示所研究的有向网。 迪杰斯特拉算法需要一个顶点集合,初始时集合内只有一个源点V0 ,以后陆续将已求得最短路径的顶点加入到集合中,到全部顶点

13、都进入集合了,过程就结束了。集合可用一维数组来表示,设此数组为S,凡在集合S以外的顶点,其相应的数组元素Si 为 0 ,否则为 1 。,另需一个一维数组D,每个顶点对应数组的一个单元,记录从源点到其他各顶点当前的最短路径长度,其初值为Di=costV0i,i=1n。数组D中的数据随着算法的逐步进行要不断地修改 定义了S集合和D数组并对其初始化后,迪杰斯特拉算法在进行中,都是从S之外的顶点集合中选出一个顶点w,使Dw的值最小。于是从源点到达w只通过S中的顶点,把 w 加入集合S中,并调整D中记录的从源点到集合中每个顶点v的距离:取Dv和Dw+costwv中值较小的作为新的Dv 重复上述,直到S中

14、包含V中其余各顶点的最短路径。,V0 V1 V2 V3 V4 V5 V0 10 30 100 V1 5 V2 50 V3 10 V4 20 60 V5 ,V0,V2,V4,V3,V5 ,V1,V0,V2,V4,V3,V5,V0,V2,V4,V3,V0,V2,V4,V0,V2,S=V0,V1,V5,V3,V4,V2,Vj,V5,V4,V3,V2,V1,i=5,i=4,i=3,i=2,i=1,D终点,所有顶点对之间的最短路径,问题描述: 已知一个各边权值均大于 0 的带权有向图,对每对顶点 vivj,要求求出每一对顶点之间的最短路径和最短路径长度。 解决方案:1. 每次以一个顶点为源点,重复执行迪

15、杰斯特拉算法n次。这样,便可求得每一对顶点之间的最短路径。总的执行时间为O(n3)。2. 形式更直接的弗洛伊德(Floyd)算法。时间复杂度也为O(n3)。,弗洛伊德算法思想:假设求从顶点Vi到Vj的最短路径。如果从Vi到Vj有弧,则从Vi到Vj存在一条长度为arcsij的路径,该路径不一定是最短路径,尚需进行n次试探。首先考虑路径(Vi,V0,Vj)是否存在(即判别(Vi,V0)、(V0,Vj)是否存在)。如存在,则比较(Vi,Vj)和(Vi,V0,Vj)的路径长度,取长度较短者为从 Vi到Vj 的中间顶点的序号不大于0 的最短路径。假如在路径上再增加一个顶点 V1,依次类推。可同时求得各对

16、顶点间的最短路径。,定义一个n阶方阵序列 D(-1),D(0),D(1),D(2),D(k),D(n-1) 其中:D(-1)ij= arcsijD(k)ij=Min D(k-1)ij, D(k-1)ik+ D(k-1)kj 0kn-1 可见,D(1)ij就是从vi到vj的中间顶点的序号不大于1的最短路径的长度;D(k)ij就是从vi到vj的中间顶点的序号不大于k的最短路径的长度;D(n-1)ij就是从vi到vj的最短路径的长度。,各顶点间的最短路径及其路径长度,最短路径弗洛伊德举例,2,1,0,2,1,0,2,1,0,2,1,0,2,1,0,P(2),P(1),P(0),P(-1),P,2,1,0,2,1,0,2,1,0,2,1,0,2,1,0,D(2),D(1),D(0),D(-1),D,本章小结 1.熟练图的各种存储结构及构造算法,了解实际问题的求解效率与采用何种存储结构和算法有密切联系。 2.熟练掌握图的两种搜索路径的遍历及算法。 3.掌握以下内容:图的最小生成树和求最小生成树算法的思想;利用AOV网络的拓扑排序问题;利用AOE网络的关键路径法;带权有向图的最短路径问题。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报