最小生成树算法及应用.pptVIP

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
最小生成树算法及应用 最小生成树算法及应用 最小生成树算法及应用 二、求图的最小生成树算法 严格来说,如果图G=(V,E)是一个连通的无向图,则把它的全部顶点V和一部分边E’构成一个子图G’,即G’=(V, E’),且边集E’能将图中所有顶点连通又不形成回路,则称子图G’是图G的一棵生成树。 对于带权连通图,生成树的权即为生成树中所有边上的权值总和,权值最小的生成树,称为图的最小生成树。 求图的最小生成树具有很高的实际应用价值,比如下面的这个例题。 最小生成树算法及应用 例1、城市公交网 [问题描述] 有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权为在这两个城市之间修建高速公路的造价,研究后发现,这个地图有一个特点,即任一对城市都是连通的。现在的问题是,要修建若干高速公路把所有城市联系起来,问如何设计可使得工程的总造价最少。   [输入] n(城市数,1=n=100); e(边数); 以下e行,每行3个数i,j,wij,表示在城市i,j之间修建高速公路的造价。   [输出] n-1行,每行为两个城市的序号,表明这两个城市间建一条高速公路。 最小生成树算法及应用 [举例] 下面的图(A)表示一个5个城市的地图,图(B)、(C)是对图(A)分别进行深度优先遍历和广度优先遍历得到的一棵生成树,其权和分别为20和33,前者比后者好一些,但并不是最小生成树,最小生成树的权和为19。 [问题分析] 出发点:具有n个顶点的带权连通图,其对应的生成树有n-1条边! 那么选哪n-1条边呢? 设图G的度为n,G=(V,E) 我们介绍两种基于贪心的算法,Prim算法和Kruskal算法。 最小生成树算法及应用 1、用Prim算法求最小生成树的思想如下: ①设置一个顶点的集合S和一个边的集合TE,S和TE的初始状态均为空集; ②选定图中的一个顶点K,从K开始生成最小生成树,将K加入到集合S; ③重复下列操作,直到选取了n-1条边: 选取一条权值最小的边(X,Y),其中X∈S,not (Y∈S); 将顶点Y加入集合S,边(X,Y)加入集合TE; ④得到最小生成树T =(S,TE) 。 如何证明Prim算法的正确性呢?提示:用反证法。 因为操作是沿着边进行的,所以数据结构宜采用边集数组表示法。 最小生成树算法及应用 ① 从文件中读入图的邻接矩阵g; ② 边集数组elist初始化; For i:=1 To n-1 Do Begin elist[i].fromv:=1;elist[i].endv:=i+1;elist[i].weight:=g[1,i+1]; End; ③ 求出最小生成树的n-1条边; For k:=1 To n-1 Do Begin min:=maxint;m:=k; For j:=k To n-1 Do {查找权值最小的一条边} If elist[j].weightmin Then Begin min:=elist[j].weight;m:=j;End; If mk Then Begin t:=elist[k];elist[k]:=elist[m];elist[m]:=t;End; {把权值最小的边调到第k个单元} j:=elist[k].endv; {j为新加入的顶点} For i:=k+1 To n-1 Do {修改未加入的边集} Begin s:=elist[i].endv; w:=g[j,s]; If welist[i].weight Then Begin elist[i].weight:=w;elist[i].fromv:=j;End; End; End; ④ 输出; ——Prim算法的实现 最小生成树算法及应用 2、用Kruskal算法求最小生成树的思想如下: 设最小生成树为T=(V,TE),设置边的集合TE的初始状态为空集。将图G中的边按权值从小到大排好序,然后从小的开始依次选取,若选取的边使生成树T不形成回路,则把它并入TE中,保留作为T的一条边;若选取的边使生成树形成回路,则将其舍弃;如此进行下去,直到TE中包含n-1条边为止。最后的T即为最小生成树。 如何证明呢? 最小生成树算法及应用

您可能关注的文档

文档评论(0)

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

你好,我好,大家好!

版权声明书
用户编号:7140162041000002

1亿VIP精品文档

相关文档