- 1、本文档共86页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
7_2new:图
7.5 有向无环图及其应用 一个无环的有向图称做有向无环图(directed acycline graph),简称DAG图。下图列出了有向树、DAG图和有向图的例子。 。 有向无环图是描述一项工程或系统的进行过程的有效工具。除最简单的情况之外,几乎所有的工程(project)都可分为若干个称作活动(activity)的子工程,而这些子工程之间,通常受着一定条件的约束,如其中某些子工程的开始必须在另一些子工程完成之后。 对整个工程和系统,人们关心的是两个方面的问题:一是工程能否顺利进行;二是估算整个工程完成所必须的最短时间,对应于有向图,即为进行拓扑排序和求关键路径的操作。 7.5.1拓扑排序 什么是拓扑排序(Topological Sort)? 简单地说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。 偏序:若集合X上的关系R是自反的、反对称的和传递的,则称R是集合X上的偏序关系。 全序:设R是集合X上的偏序(Partial Order),如果对每个x,y∈X必有xRy或yRx,则称R是集合X上的全序关系。 偏序指集合中仅有部分成员可比较,全序指集合中全体成员均可比较。如下图所示,两个有向图,弧(x,y)表示x≤y,则(a)表示偏序,(b)表示全序。若在(a)的有向图上人为地加一个表示v2≤v3的弧(符号“≤”表示v2领先于v3),则(a)表示的亦为全序,且这个全序称为拓扑有序(Topological Order),而由偏序定义得到拓扑有序的操作便是拓扑排序。 举例: 例如,例如,计算机专业学生的学习就是一个工程,每一门课程的学习就是整个工程的一些活动。其中有些课程要求先修课程,有些则不要求。这样在有的课程之间有领先关系,有的课程可以并行地学习。 可以用有向图表示一个工程。在这种有向图中,用顶点表示活动,用有向边Vi, Vj表示活动间的优先关系。Vi 必须先于活动Vj 进行。这种有向图叫做顶点表示活动的AOV网络(Activity On Vertices)。 在AOV网络中,如果活动Vi 必须在活动Vj 之前进行,则存在有向边Vi, Vj, AOV网络中不能出现有向回路,即有向环。在AOV网络中如果出现了有向环,则意味着某项活动应以自己作为先决条件。 因此,对给定的AOV网络,必须先判断它是否存在有向环。 对AOV网络构造它的拓扑有序序列。即将各个顶点 (代表各活动)排列成一个线性有序序列,使得AOV网络中所有应存在的前驱和后继关系都能得到满足。 这种构造AOV网络全部顶点的拓扑有序序列的运算就叫做拓扑排序。 拓扑排序 (1)结果是产生一个拓扑有序序列 (2)在拓扑排序的结果中: 序列的顶点数 = 图中的顶点数 无回路 序列的顶点数 图中的顶点数 有回路 如何进行拓扑排序? 例如,下图的有向图有如下两个拓扑有序序列: (C1, C2, C3, C4, C5, C7, C9, C10, C11, C6, C12, C8) 和(C9, C10, C11, C6, C1, C12, C4, C2, C3, C5, C7, C8) (也可构造得其它的拓扑有序序列)。 进行拓扑排序的方法 (1)输入AOV网络。令 n 为顶点个数。 (2)在AOV网络中选一个没有直接前驱的顶点并输出; (3)从图中删去该顶点, 同时删去所有它发出的有向边; 重复以上(2)(3)步, 直到 a: 全部顶点均已输出,拓扑有序序列形成,拓扑排序完成;或 b: 图中还有未输出的顶点,但已跳出处理循环。这说明图中还剩下一些顶点,它们都有直接前驱,再也找不到没有前驱的顶点了。这时AOV网络中必定存在有向环。 在邻接表的头结点中增设一个域indegree,记录各个顶点入度。入度为零的顶点即无前驱的顶点。 输入数据前,邻接表的顶点表G.vertices[ ].indegree 全部初始化。输入数据时,每输入一条边j, k,就需要建立一个边结点,并将它链入相应边链表中,统计入度信息: //建立边结点, data域赋为 k p→nextarc = G.vertices[j].firstarc; G.vertices[j].firstarc = p; //链入顶点 j 的边链表的前端 G.vertices[k].indegree++; //顶点 k 入度加一 在拓扑排序算法中,使用一个存放入度为零的顶点的链式栈,供选择和输出无前驱的顶点。只要出现入度为零的顶点,就将它加入栈中。 使用这种栈的拓扑排序算法可以描述如下: 建立入度为零的顶点栈; 入度为零的顶点栈不空时, 重复执行 从顶点栈中退出一个
文档评论(0)