- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)