您正在学习:第十三章 树算法 第三节 最小生成树算法.doc

您正在学习:第十三章 树算法 第三节 最小生成树算法.doc

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

您正在学习:第十三章 树算法 第三节 最小生成树算法 § 13.3 最小生成树算法 在这一节,我们将介绍求最小生成树的两个算法:Prim算法和Kruskal算法,它们都蕴涵了贪婪法的思想. ********************************************************************* 提示:贪婪法是一种可被用于各种各样问题的处理,它把解看成是由若干个部件构成,每一步求出解的一个部分,但这不是从整体或长远的角度去考虑的,只是局部或当前的最好选择.求出的一个个部件组合而作为最终的解. 注意:贪婪法只是一种试探法,计算上方便、有效,可提供正确解的一个近似。但一般情况下,不能保证输出的解是正确的,其正确性需要证明,这往往比较困难. ********************************************************************* ? 13.3.1 Kruskal算法 假设给定了一个加权连通图G,G的边集合为E,顶点个数为n。Kruskal于1956年证明了,按下述贪婪法总可得到G的一棵最小生成树T. Kruskal算法的粗略描述: 为直观,假设T中的边和顶点均涂成红色,其余边为白色.一开始G中的边均为白色. 1)将所有顶点涂成红色; 2)在白色边中,挑选一条权最小的边,使其与红色边不形成圈,将该白色边涂红; 3)重复2)直到有n-1条红色边,这n-1条红色边便构成最小生成树T的边集合. ********************************************************************* 做:加用上述方法在图上手工操作,求出图13.2的最小生成树。 ********************************************************************* 手工操作时,第2步中,判断是否形成圈一眼就可看出,但计算机实现就不是那么直接. 注意到在算法执行过程中,红色顶点和红色边会形成一个或者一个以上的连通分支,它们都是G的子树.一条边与红色边形成因当且仅当这条边的两个端点属于同一个子树.因此判定一条边是否与红色边形成圈,只需判断这条边的两端点是否属于同一个子树. 上述判断可这样实现:给每个子树一个不同的编号,对每一个顶点引入一个标记t,表示这个顶点所在的子树编号.当加人一条红色边,就会使该边两端点所在的两个子树连接起来,成为一个子树,从而两个子树中的顶点标记要改变成一样.综上,可将Kruskal算法细化使其更容易计算机实现. 变量说明: c:生成树的费用; T:生成树的边集合; j:迭代次数; k:记录已经被选人生成树的边数. Kruskal算法: 输入加权连通图G的边权矩阵,顶点数n. 1)整理边权矩阵 将按第三行由小到大的次序重新排列,得到新的边权矩阵; 2)初始化 3)更新T,c,t(i) 4)若k=n-1或j=n,则终止,输出T,c;否则返回3). ********************************************************************* 注意:1) Kruskal算法最终输出的必定是最小生成树,是最优解. 2)Kruskal算法的时间复杂度为 ********************************************************************* 例 13.1 一个编程例子 借助MATLAB软件,用Kruskal算法求图13.2所示的加权图的最小生成树. 加权图的存储结构采用边权矩阵,编制的MATLAB程序 Kruskal.m如下. % Kruskal’s algorithm b=[1 1 1 2 2 3 3 4;2 4 5 3 5 4 5 5;8 1 5 6 7 9 10 3] %按边权由小到大重新排列矩阵b的列 m=size(b,2);n=5; t=1:n;k=0;T=[];c=0; for i= l:m if t(B1,i))~=t(B(2,i)) %判断第i条边是否与树中的边形成圈 k=k+1;T(k,1:2)=B(1:2,i);c=c+B(3,i) tmin=min(t(B(1,i)),t(B(2,i))); trnax=max(t(B(1,i)),t(B(2,i))); for j=1:n if t(j)= =tmax t(j)= tmin; end

文档评论(0)

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

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

1亿VIP精品文档

相关文档