数据结构最小生成树与拓扑排序.ppt

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

7.4 图的连通性问题 1)无向图的连通分量和生成树 2)最小生成树 3)普里姆算法 4)克鲁斯卡尔算法 对于带权的连通图(连通网)G,其生成树也是带权的,将权最小的生成树称为最小生成树。 连通网最小生成树的意义? 如何构造最小生成树? 对于带权的连通图(连通网)G,其生成树也是带权的,将权最小的生成树称为最小生成树。 连通网最小生成树的意义? 如何构造最小生成树? 最小生成树的MST性质: 假设 N =(V,{E})是一个连通网,U是顶点集 V 的一个非空子集。若(u,v)是一条具有最小权值(代价)的边,其中 u ∈U,v∈V-U,则必存在一棵包含边(u,v)的最小生成树。 7.4 图的连通性问题 1)无向图的连通分量和生成树 2)最小生成树 3)普里姆算法 4)克鲁斯卡尔算法 3.普里姆(Prim)算法 基本思想: (1)假设 G=(V,{E}) 是一个具有 n 个顶点的连通网络,T=(U,{TE})是 G 的最小生成树,其中 U 是 T 的顶点集,TE 是 T 的边集,U 和 TE 的初值均为空; (2)从 V 中任取一个顶点(假定为 V1),将此顶点并入 U中,此时最小生成树顶点集 U={V1}; (3)从那些其中一个端点已在 U 中,另一端点仍在 U 外的所有边中,找一条最短(即权值最小)的边,设该边为(Vi,Vj),其中 Vi∈U,Vj∈V-U,并把该边和顶点 Vj分别并入 T 的边集 TE 和顶点集 U; (4)如此进行下去,每次往生成树里并入一个顶点和一条边,直到 n-1 次后,把所有 n 个顶点都并入生成树 T 的顶点集 U 中,此时 U=V,TE中包含有(n-1)条边;这样,T 就是最后得到的最小生成树。 实现该算法需附设一个辅助数组closedge,以记录从 U 到 V-U 具有最小代价的边。对每个顶点 vi∈V-U,在辅助数组中存在一个相应分量closedge[i-1](下标从0开始),它包括两个域。其中:lowcost存储该边上的权。显然, closedge[i-1].lowcost =Min{cost(u,vi)|u∈U} 即vi到已生成子树的最短距离等于到U中所有顶点中的最小边的权值。 ???? vex域存储该边依附的在U中的顶点。 4.克鲁斯卡尔(Kruskal)算法 4.克鲁斯卡尔(Kruskal)算法 7.5 有向无环图及其应用 有向无环图(directed acycline graph)简称DAG图,是描述一项工程或系统的进行过程的有效工具。 对整个工程和系统,人们关心的是两个方面的问题:一是工程能否顺利进行;二是估算整个工程完成所必须的最短时间。 有向无环图的应用: 拓扑排序 关键路径 在工程实践中,一个工程项目往往由若干个子项目组成,这些子项目间往往有多种关系: ①先后关系,即必须在一子项目完成后,才能开始实施另一个子项目; ②子项目之间无次序要求,即两个子项目可以同时进行,互不影响。 7.5.1 拓扑排序 我们用一种有向图来表示上述问题。在这种有向图中,顶点表示活动,有向边表示活动的优先关系,这种有向图叫做顶点表示活动的网络(Activity On Vertex Network)简称为AOV网。 课程先后关系如图: 何谓“拓扑排序” ? 如何进行拓扑排序? 拓扑排序算法的实现 用邻接表存储AOV网络,拓扑排序算法描述: 拓扑排序算法 Status Topological Sort(ALGraph G){ //有向图G采用邻接表存储结构。若G无回路, //则输出G的顶点的1个拓扑序列并返回OK,否则ERROR FindInDegree(G,indegree); //对各顶点求入度indegree[0..vernum-1] InitStack(S); for(i=0;iG.vexnum; ++i)//建零入度顶点栈 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号顶点的每

文档评论(0)

173****7830 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档