第二十八讲 拓扑排序和关键路径.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第 二十八 讲 知 识 点 克鲁斯卡尔(Kruskal)算法 AOV网与AOE网 拓扑排序的定义和基本术语 活动的最早开始时间、最迟开始时间 关键活动、关键路径的确定 重 点 关键路径中各顶点与活动最早开始时间和 最迟开始时间的确定 4、 克鲁斯卡尔(Kruskal)算法 1)基本思想 假设G =(V,E)是一个具有n个顶点的连通 网络,T=(U,TE)是G 的最小生成树,U的初值 等于V,即包含有G中的全部顶点,TE的初值 为空集。 将图G中的边按权值从小到大的顺序依次选取, 若选取的边使生成树T不形成环路,则把它并 入TE中,做为生成树T的一条边,若选取的边 使生成树T形成环路,则将其舍弃,如此进行 下去,直到TE中包含n-1条边为止。此时的T即 为最小生成树。 7.6 有向无环图及其应用 7.6 .1 基本概念 1、活动 把子项目、工序、课程看成一个个顶点,称之 为活动(Activity)。 2、有向无环图是描述一项工程和系统的有效工具。 用顶点表示活动,则对图进行拓扑排序和求关 键路径分别能判断工程是否能顺利进行和估算 工程完成的最短时间。 3、AOV网 用顶点表示活动,用弧表示活动间的有限关系的有向图称为AOV网。 如果从顶点Vi到Vj之间存在有向边 Vi,Vj, 则表示活动i必须先于活动j进行。 4、在AOV网络中,如果顶点Vi的活动必须在顶 点Vj的活动以前进行,则称Vi为Vj的前趋顶点 而称Vj为Vi的后继顶点。这种前趋后继关系有 传递性。 4、AOV网络中一定不能有有向环路。 7.6 .2 拓扑排序 1、所谓“拓扑排序”就是将AOV网络中的各个顶 点(各个活动)排列成一个线性有序序列,使 得所有要求的前趋、后继关系都能得到满足。 2、由于AOV网络中有些顶点之间没有次序要求, 它们在拓扑有序序列中的位置可以任意颠倒, 所以拓扑排序的结果一般并不是唯一的。 3、拓扑排序方法 (1) 在网络中选择一个没有前趋的顶点,并把它 输出; (2) 从网络中删去该顶点和从该顶点发出的所有 有向边; (3) 重复执行上述两步,直到网中所有的顶点都 被输出 (此时,原AOV网络中的所有顶点和边 就都被删除掉了)。 4、用邻接表存储AOV网络,拓扑排序的步骤如下: (1) 把邻接表中所有入度为零的顶点进栈; (2) 在栈不空时: ①退栈并输出栈顶的顶点j; ②在邻接表的第i个单链表中,查找顶点为j 的所有直接后继顶点k,并将顶点k的入度 减1。若顶点k的入度为零,则顶点k进栈; ③若栈空时输出的顶点个数不是n,则有向图 中有环路,否则拓扑排序完毕。 (算法7.12 P 182) Status TopologicalSort(ALGraph G) {// 有向图采用邻接表存储, 若G无回路,则输出G的顶 //点的一个拓扑序列并返回OK,否则ERROR。 SqStack S; int count,k,i; ArcNode *p; char indegree[MAX_VERTEX_NUM]; FindInDe (G, inde); // 对各顶点求入度inde[0..vernum-1] InitStack(S); for (i=0; iG.vexnum; ++i) // 建零入度顶点栈S if (!indegree[i]) Push(S, i); // 入度为0者进栈 count = 0; // 对输出顶点计数 while (!StackEmpty(S)) { Pop(S, i); printf(i, G.vertices[i].data); ++count; // 输出i号顶点并计数 for (p=G.vertices[i].firstarc; p; p=p-nextarc) {k = p-adjvex; // 对i号顶点的每个邻接点的入度减1 if (!(--indegree[k])) Push(S, k); // 若入度减为0,则入栈 } } if (countG.vexnum) return ERROR; // 该有向图有回路 else return OK; } 7

文档评论(0)

好文精选 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档