第七讲 图的生成树与最短路径.docVIP

  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文档。上传文档
查看更多
第七讲 图的生成树与最短路径

第七讲 图的生成树与最短路径 一、图的生成树与最小生成树 在一个连通图G中,如果取它的全部顶点和一部分边构成一个子图G’,即: 若边集E(G’)中的边既将图中的所有顶点连通又不形成回路,则称子图G’是原图G的一棵生成树。 最小生成树:给图中每个边赋一权值,所有生成树中所选择边的权值之和最小的生成树,称之为最小代价生成树,即是最小生成树。 1、普里姆算法 1.1算法描述 假设G=(V, E)是一个具有n个顶点的连通网,T=(U, TE)是G的最小生成树,其中U是T的顶点集,TE是T的边集,U和TE的初值均为空集。算法开始时,首先从V中任取一个顶点(假定取v1),将它并入U中,此时U={v1},然后只要U是V的真子集(即),就从那些其一个端点已在T中,另一个端点仍在T外的所有边中,找一条最短(即权值最小)边,假定为(vi, vj),其中,并把该边(vi, vj)和顶点vj分别并入T的边集TE和顶点集U,如此进行下去,每次往生成树里并入一个顶点和一条边,直到(n-1)次后就把所有n个顶点都并入到生成树T的顶点集中,此时U=V,TE中含有(n-1)条边,T就是最后得到的最小生成树。 1.2关键问题 普里姆算法的关键之处是:每次如何从生成树T中到T外的所有边中,找出一条最短边。例如,在第k次前,生成树T中已有k个顶点和(k-1)条边,此时T中到T外的所有边数为k(n-k),当然它包括两顶点间没有直接边相连,其权值被看作为“无穷大”的边在内,从如此多的边中查找最短边,其时间复杂性为O(k(n-k)),显然是很费时的。是否有一种好的方法能够降低查找最短边的时间复杂性呢? 1.3 解决方法 方法是:假定在进行第k次前已经保留着从T中到T外每一顶点(共(n-k)个顶点)的各一条最短边,进行第k次时,首先从这(n-k)条最短边中,找出一条最最短的边(它就是从T中到T外的所有边中的最短边),假设为(vi, vj),此步需进行(n-k)次比较;然后把边(vi, vj)和顶点vj分别并入T中的边集TE和顶点集U中,此时T外只有n-(k+1)个顶点,对于其中的每个顶点vt,若(vj, vt)边上的权值小于已保留的从原T中到vt的最短边的权值,则用(v, vt)修改之,使从T中到T外顶点vt的最短边为(vj, vt),否则原有最短边保持不变,这样,就把第k次后从T中到T外每一顶点vt的各一条最短边都保留下来了。为进行第(k+1)次运算做好了准备,此步需进行(n-k-1)次比较。所以,利用此方法求第k次的最短边共需比较2(n-k)-1次,即时间复杂性为O(n-k)。 1.4 prim算法: 设一个辅助数组closedge,以记录从U到V—U具有最小代价的边。数组中的每个元素closedge[v]是记录类型,包含两个域: closedge[v].lowcast=Min{cost(u,v)|u∈U}; closedge[v].vex存储该边依附的在U中的顶点。 proc mintree_prim(gn:adjmatrix;u0:integer); begin for v:=1 to n do if vu0 then with closedage[v] do [vex:=u0; lowcast:=gn[u0,v];] closedge[u0].lowcast:=0;{并入U集合} for i:=1 to n-1 do begin v:=min(closedge);{寻找代价最小的边} write(closedge[v].vex,v); closedge[v].lowcast:=0;{并入U集合} for k:=1 to n do if gn[v,k]closedge[k].lowcast then begin closedge[k].lowcast:=gn[v,k]; closedge[k].vex:=v; end; end; end; 练习1:prim算法实现 【问题描述】从文件中读入连通带权图的信息,按prim算法求出该图的最小生成树,以V1作为初始结点。 【输入文件】第一行两个整数m和n,分别表示图的结点数和图中的边数。以下n行表示n条边:每一行三个数x、y和k,k表示x与y之间边的权值。 【输出文件】共m行,第一行:最小生成树的权;以下m-1行表示选取的边,边的第1个结点小于第2个结点,并按结点由小到大输出。 【示例】输入:5 7 输出:45 1 2 17 1 4 2 3 30 1 5 1

文档评论(0)

hf916589 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档