算法和程序设计实验最小生成树(c语言).ppt

算法和程序设计实验最小生成树(c语言).ppt

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最小生成树 问题分析: 由于在每两个城市之间都可以建立一条通信线路,n个城市之间最多可能设置n(n-1)/2条线路,而每条线路都要付出一定的经济代价,因此,如何从中选择n-1条线路使总的耗费最少成为问题的关键。 问题等价: 用连通网来表示n个城市以及n个城市之间可能设置的通信线路,其中网中的顶点表示城市,边表示两城市之间的线路,赋于边的权值表示相应的经济代价。 建立总花费最少的通信网问题就转换为求连通网的最小生成树的问题。 最小生成树的定义: 按照生成树的定义,含n个顶点的连通网的生成树有n个顶点、n-1条边。因此,可以建立许多不同的生成树,如果一棵生成树的代价等于树上各边权值之和,那么肯定有一棵生成树的代价最小,称为最小代价生成树(简称最小生成树)。 MST性质: 假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集。若(u,v)是一条具有最小权值(代价)的边,其中u∈U,v ∈V-U,则最小生成树中必包含边(u,v)。 构造最小生成树的算法 普里姆算法的基本思想: 假设N=(V,{E})是连通图,TE是N上最小生成树中边的集合。算法从U={u0}(u0∈V),TE={}开始,重复执行下述操作:在所有u∈U, v ∈V-U的边(u,v)∈E中找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直至U=V为止。此时TE中必有n-1条边,则T=(V,{TE})为N的最小生成树。 简言之: Prim算法 算法分析: 普里姆算法的时间复杂度为O(n2)。 该算法与网中的边的数目无关。 适用于求边稠密的网的最小生成树。 克鲁斯卡尔算法 算法分析: 克鲁斯卡尔算法的时间复杂度为O(eloge)。 该算法与网中的边的数目有关。 适用于求边稀疏的网的最小生成树。 构造最小生成树的算法 课程小结 最小生成树的定义 重点讲解了两种求最小生成树的算法 普里姆算法 克鲁斯卡尔算法 * (Minimum Cost Spanning Tree) 假设要在 n 个城市之间建立通信联络网,则连通 n 个城市只需要修建 n-1条线路,如何在最节省经费的前提下建立这个通信网? 问题: U V-U u v 算法二:(克鲁斯卡尔算法) 算法一:(普里姆算法) 取图中任意一个顶点 u ∈ U作为生成树的根,之后往生成树上添加新的顶点 v ∈ V-U。在添加的顶点 v和已经在生成树上的顶点u 之间必定存在一条边(u,v),并且该边的权值在所有连通顶点集U 和 V-U 之间的边中取值最小。之后继续往生成树上添加顶点,直至生成树上U含有 n 个顶点为止。 设置一个辅助数组closedge,来记录从顶点集U到V-U具有最小代价的边。 struct { VertexType adjvex; // U集中的顶点序号 VRType lowcost; // 边的权值 } closedge[MAX_VERTEX_NUM]; a b c d e g f 19 5 14 18 27 16 8 21 3 a e 12 d c b 7 a a a 19 14 18 14 例如: e 12 e e 8 16 8 d 3 d d 7 21 3 c 5 5 初始状态: U={a} TE={} V={a,b,c,d,e,f,g} V-U={b,c,d,e,f,g} 16 g 21 f a b c d e g f 19 5 14 18 27 16 8 21 3 a e 12 d c b g f 7 14 8 5 3 16 21 所得生成树权值之和= 14+8+3+5+16+21 = 67 A B C D E F 6 5 1 5 3 6 6 4 5 2 {} {A,C,F,D,B,E} BE 3 BE 3 {E} {A,C,F,D,B} CB 5 CE 6 CB 5 {B,E} {A,C,F,D} FD 2 CE 6 FD 2 CB 5 {B,D,E} {A,C,F} CF 4 CF 4 CE 6 AD 5 CB 5 {B,D,E,F} {A,C} AC 1 ~ ∞ ~ ∞ AD 5 AC 1 AB 6 {B,C,D,E,F} {A} TE F E D C B V-U U A B C D E F 1 5 3 4 2 返回 具体做法: 先构造一个只含 n 个顶点的子图 SG,然后从权值最小的边开始,若它的添加不使SG 中产生回路,则在 SG 上加上这条边,如此重复,直至加上 n-1 条边为止。 一句话,“不构成环的情况下,每次选取最小边” 考虑问题的出发点: 为使生成树上边的权值之和达到最小,则应使生成树中每一条边的权值尽可能地小。 克鲁斯卡尔算法的基本思想: a b c d e g

文档评论(0)

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

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

1亿VIP精品文档

相关文档