第三节最小生成树.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文档。上传文档
查看更多
第三节最小生成树

第三节 最小生成树 在偏远地区,可以通过公路连接分散的村落,但是没有电话服务。我们希望铺设电话线路,使得每一对村落都可以用电话线连接 不必是直接的 . 沿着现存的公路铺设电话线是最便宜的. 沿着哪些公路铺设电话线, 可以确保每一对村子被连接, 且电话线总长度 这一总长度可能和成本成正比 可以达到最小呢?把村庄看做图的顶点,两个村庄有公路直接相连,则存在一条边. 村庄之间公路的长度看做边的权值,我们实际上就是要寻找图的一个生成树,使得各边权值的和最小. 生成树在计算机设计,网路通信等方面有着重要的应用,本节我们将介绍解决最小生成树问题的几个算法. 关于最小生成树问题更多的内容,可参考Graham Hell []. 加权图是各边都标有数值 称为边的权值,我们只考虑非负实数情形 的图. 一个图的权是图中各边的权之和. 最小生成树问题就是给定一个加权连通图,寻找一个权最小的生成树. 下面我们给出解决这一问题的算法. Kruskal算法:求加权连通图的最小生成树 输入:一个加权连通图 个顶点 . 输出:图的权值最小的生成树. 思想:从权值最小的边开始,通过不断地增加边且不形成圈来扩张,最后形成树. 先以权值递增的顺序排列各边,权值相同的边可以任意排序. 步骤:1. 将各边按权值递增的顺序排序, 设为空集. 2. 检查排序列表中未被检查的第一条边,并将其加入中当且仅当它不与中的其它边形成圈. 如果这条边加入到中则进入步骤3,否则重复2. 3. 如果有条边则停止,输出, 否则进入2. 下面先举例说明Kruskal算法怎么实现. 考虑图3.1中的图.我们来按照Kruskal算法找出的一棵生成树. 给各边排序:d,f,a,b,h,i,g,c,e,j 先将d加入,再加入f 因为f和d不构成圈 . 这时注意a, b, h的权是相同的,可以按任意顺序考虑这三条边. 不妨先考虑a,它和 这时 不构成圈. 故将a加入. 同样接下来可以先考虑b,也可以先考虑h. 如果先考虑b,注意b加入到中就形成圈了 此时 ,故b不能加入到T中. 接着考虑h......像这样一直下去就得到图的一棵生成树. 其中生成树和生成树都是图的最小生成树,换句话说,同一个图的最小生成树不是唯一的. 下面我们来证明Kruskal算法的正确性. 定理3.1 Kruskal 1956 在加权连通图中,Kruskal算法构造出一棵权值最小的生成树. 证明:考虑任意一条边时是无圈图,下面说明算法一定可以停止. 如果在考虑最后一条边后得到. 首先一定是连通的. 因为若不连通,则一定有一条连接的连通分支的边加入到中,这与考虑了所有边矛盾。连通且无圈,故是树. 令是由算法得到的树,而是权值最小的一棵生成树. 下设. 令是选择的过程中第一条位于中而不在中的边. 将添加到中就构成一个圈. 由于中无圈,故此圈中有一边,考虑生成树 为什么是生成树? . 由于在选择时,和均是可选的 为什么? ,故得权值不大于的权值. 因此生成树的权值不超过的权值. 和相比,有更多的边与选择的过程开始时选用的边保持一致. 重复这样的过程,就得到与相同的最小生成树,证毕. Kruskal算法是一种贪心算法 greedy algorithm . 所谓贪心算法是指每一步的选择都是局部最优的, 期望通过所做的局部最优选择产生一个全局最优选择. 一般来说, 贪心算法得到的解不一定是最优的,但对Kruskal算法来说却是最优的. 求加权连通图的最小生成树问题有许多算法,下面给出另外一个著名的算法:Prim算法,这也是一种贪心算法,其最优性的证明留作习题. Prim算法:求加权连通图的最小生成树 输入:一个加权连通图 个顶点 . 输出:图的权值最小的生成树. 思想:从权值最小的边开始,通过不断地增加边且不形成圈来扩张,最后形成树. 先以权值递增的顺序排列各边,权值相同的边可以任意排序. 步骤:1. 设置集合为空集,选出图的任意一个顶点放入中,. 2. 把中的顶点与不在中的顶点的所有边中权值最小的边加入中. 如果权值最小的边有多条则任选其一. 3. 如果有条边则停止,输出, 否则进入2. 修改Kruskal算法使得可以寻找最大生成树. 如果加权连通图中各边的权值都不相同,是否可能有多棵最小生成树? 证明Prim算法确实可以找到一棵最小生成树. 证明对于一个加权连通图来说,Kruskal算法在选择下一条边时,如果它面临多条权值相同的边,则无论怎么选择,最小生成树中边的权值构成的序列 按递增次序 是唯一的. 设是加权连通图的一棵最小生成树,证明中任意圈均有权值最大的一条边不在中. 对图3.1中的图G,以中间的顶点开始利用Prim算法寻找一颗最小生成树.

文档评论(0)

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

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

1亿VIP精品文档

相关文档