- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法设计Algorithm Design 主讲教师 任瑞征 第七章 图 7.2 图的存储结构 7.3 图的遍历 7.4 图的连通性问题 7.5 有向无环图 及其应用 7.6 最短路径 7.5.2 关键路径 AOE-网(Activity On Edge network) 带权的有向无环图,其中顶点表示事件, 弧表示活动,权表示活动的持续时间。 (p183) 假设以AOE-网表示一个工程的施工流程图,每条弧表示一项子工程,弧上的权值表示完成该项子工程所需要的时间。 需要研究的问题是: 完成整个工程至少需要多少时间? 哪些子工程是“关键工程” ?即哪些子工程将影响整个工程的完成期限? 从源点到汇点的最长路径称为关键路径,关键路径的长度是完成整个工程的最短时间。 a b c d e f g h k 6 4 5 2 1 1 8 7 2 4 4 例: 源点 汇点 6 1 7 4 关键路径上的活动称为关键活动,关键活动是影响整个工程进度的关键。 如何求关键活动? 设:e (i) 为活动ai 的最早开始时间, l (i) 为活动ai 的最迟开始时间, 则 对于关键活动ai e(i) = l (i) 设:ve(j) 为事件vj 的最早发生时间, vl(j) 为事件vj 的最迟发生时间, 活动ai 由弧j, k表示, 其持续时间记为dut(j, k) 则 e(i) = ve(j) l(i) = vl(k)-dut(j, k) (7-1) 例: ve(9) = 18 e(6) = ve(4) = 5 l(6) = vl(6)-dut(4, 6) = 10-2 = 8 事件最早发生时间和最迟发生时间的计算: (1) 从 ve(0) = 0 开始向前递推 ve(j) = Max{ve(i) + dut(i, j)} (7-2) i, j?T, 1? j ? n-1 其中,T 是所有以第 j 个顶点为头的弧的集合。 i (2) 从 vl(n-1) = ve(n-1) 起向后递推 vl(i) = Min{vl(j) – dut(i, j)} (7-3) i, j?S, 0? i ? n-2 其中,S 是所有以第 i 个顶点为尾的弧的集合。 j a b c d e f g h k 6 4 5 2 1 1 8 7 2 4 4 0 0 0 0 0 0 0 0 0 6 4 5 7 14 7 15 18 18 18 18 18 18 18 18 18 18 16 14 7 6 6 10 8 0 例: 0 6 4 5 7 7 15 14 18 18 14 16 10 7 8 6 6 0 0 0 0 6 4 5 7 7 7 15 14 14 16 0 2 3 6 6 8 8 7 10 ? ? ? ? 算法的实现要点: 求各顶点的ve 值在拓扑排序的过程中进行,即按拓扑有序的次序依次计算; 求各顶点的vl 值按拓扑逆序的次序进行,因此,应该在拓扑排序的过程中另设一个栈记下拓扑有序序列。 算法 7.13 (p185) Status ToplogicalOrder( ALGraph G, Stack T ){ // 有向网 G 采用邻接表存储结构, T 为拓扑序列顶点栈 // 求各顶点事件的最早发生时间 ve (全局变量) // 若 G 无回路,则用栈 T 返回 G 的一个拓扑序列, // 且函数值为 OK,否则为 ERROR FindInDegree(G, indegree); // 求各顶点入度 indegree[0..vexnum-1] InitStack(S); // 建零入度顶点栈 S for ( i=0; iG.vexnum; ++i ) if ( !indegree[i] ) Push( S, i ); InitStack(T); count = 0; ve[0..G.vexnum-1] = 0; 算法 7.13 (p185) while ( !StackEmpty(S) ) { Pop(S, j); Push(T, j); ++count; for (p=G. vertices[j].firstarc; p; p= p
文档评论(0)