第13章 图 计算机软件技术基础教程 教学课件.ppt

第13章 图 计算机软件技术基础教程 教学课件.ppt

  1. 1、本文档共130页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第13章 图 计算机软件技术基础教程 教学课件

第13章 图 13.2 图的存储方法 13.3 图 的 遍 历 13.4 生成树和最小生成树 13.5 最 短 路 径 13.6 拓 扑 排 序 13.7 关 键 路 径 图13.18 AOV网拓扑排序过程 拓扑排序可在有向图的不同存储结构表示方法上实现。下面针对图13.19(a)所给出的AOV网进行讨论。 在邻接矩阵中,由于某个顶点的入度由这个顶点相对应的列上的1的个数所确定,而它的出度由顶点所对应的行上的1的个数所确定,所以在这种存储结构上实现拓扑排序算法的步骤是: (1) 取1作为第1个新序号。 (2) 找一个没有得到新序号的全零矩阵列,若没有则停止寻找。这时如果矩阵中所有列都得到了新序号,则拓扑排序完成,否则说明该有向图中有环存在。 (3) 把新序号赋给找到的列,并将该列对应的顶点输出。 (4) 将找到的列所对应的行全部置零。 (5) 新序号增1,重复执行步骤(2)~(5)。 根据以上步骤,使用一个长度为n的数组来存放新序号时,可给出以下的具体算法: TOPOSORTA(graph ?g,int n) /*对有n个顶点的有向图,使用邻接矩阵求拓扑排序*/ { int i, j, k, t, v, D[n]=0; v=1; /* 新序号变量置1 */ for?(k=0; kn; k++) {for?(j=0; jn; j++) /*寻找全零列*/ if?(D[j]= =0) { t=1; for?(i=0; in; i++) if?(g-arcs[i][j]= =1) {t=0; break; } /* 若第j列上有1,则跳出循环 */ if?(t= =1) {m=j; break; } /*找到第j列为全0列*/ } if?( j!=n ) { D[m]=v; /* 将新序号赋给找到的列 */ printf?( %d\t , g-vexs[m]); /* 将排序结果输出 */ for?(i=0; in; i++) g-arcs[m][i]=0; /*将找到的列的相应行置全0*/ v++; /*新序号增1*/ } else break; } if( v-1n ) printf?( \n The network has a cycle \n ); } /* TOPOSORTA */ 对图13.19中G1的邻接矩阵应用以上算法得到的拓扑排序序列为:v1,v2, v4, v3, v5, v6, v7。 利用邻接矩阵进行拓扑排序时,程序虽然简单,但效率不高,算法的时间复杂度约为O(n3)。而利用邻接表会使寻找入度为0的顶点的操作简化,从而提高拓扑排序算法的效率。 在邻接表存储结构中,为了便于检查每个顶点的入度,可在顶点表中增加一个入度域(id),这样的邻接表如图13.19(b)所示,这样只需对由n个元素构成的顶点表进行检查就能找出入度为0的顶点。为了避免对每个入度为0的顶点重复访问,可用一个链栈来存储所有入度为0的顶点。在进行拓扑排序前,只要对顶点表进行一次扫描,便可将所有入度为0的顶点都入栈,以后每次从栈顶取出入度为0的顶点,并将其输出。 一旦排序过程中出现新的入度为0的顶点,同样又将其入栈。在入度为0的顶点出栈后,根据顶点的序号找到相应的顶点和以该顶点为起点的出边,再根据出边上的邻接点域的值使相应顶点的入度值减1,便完成了删除所找到的入度为0的顶点的出边的功能。 在邻接表存储结构中实现拓扑排序算法的步骤为: (1) 扫描顶点表,将入度为0的顶点入栈。 (2) 当栈非空时执行以下操作: ?{ 将栈顶顶点vi的序号弹出,并输出之; 检查vi的出边表,将每条出边表邻接点域所对应的顶点的入度域值减1,若该顶点入度为0,则将其入栈; } (3) 若输出的顶点数小于n,则输出“有回路”,否则拓扑排序正常结束。 在具体实现时,链栈无须占用额外空间,只需利用顶点表中入度域值为0的入度域来存放链栈的指针(即指向下一个存放链栈指针的单元的下标),并用一个栈顶指针top指向该链栈的顶部即可。由此给出以下的具体算法: typede

文档评论(0)

qiwqpu54 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档