码迷,mamicode.com
首页 > 其他好文 > 详细

最小生成树(普利姆算法、克鲁斯卡尔算法)

时间:2014-06-07 23:33:25      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:c   style   class   a   http   width   

给定一个带权的无向连通图,怎样选取一棵生成树,使树上全部边上权的总和为最小,这叫最小生成树.

求最小生成树的算法
(1) 克鲁斯卡尔算法
图的存贮结构採用边集数组,且权值相等的边在数组中排列次序能够是随意的.该方法对于边相对照较多的不是非常有用,浪费时间.
(2) 普里姆算法
图的存贮结构採用邻接矩阵.此方法是按各个顶点连通的步骤进行,须要用一个顶点集合,開始为空集,以后将以连通的顶点陆续增加到集合中,所有顶点增加集合后就得到所需的最小生成树 .


以下来详细讲下:
克鲁斯卡尔算法
方法:将图中边按其权值由小到大的次序顺序选取,若选边后不形成回路,则保留作为一条边,若形成回路则除去.依次选够(n-1)条边,即得最小生成树.(n为顶点数)
bubuko.com,布布扣
第一步:由边集数组选第一条边
bubuko.com,布布扣
第二步:选第二条边,即权值为2的边
bubuko.com,布布扣
第三步:选第三条边,即权值为3的边
bubuko.com,布布扣
第四步:选第四条边,即权值为4的边
bubuko.com,布布扣
第五步:选第五条边
bubuko.com,布布扣

 


普里姆算法
方法:从指定顶点開始将它增加集合中,然后将集合内的顶点与集合外的顶点所构成的所有边中选取权值最小的一条边作为生成树的边,并将集合外的那个顶点增加到集合中,表示该顶点已连通.再用集合内的顶点与集合外的顶点构成的边中找最小的边,并将对应的顶点增加集合中,如此下去直到所有顶点都增加到集合中,即得最小生成树.
例在下图中从1点出发求出此图的最小生成树,并按生成树的边的顺序将顶点与权值填入表中.
bubuko.com,布布扣
———————>先写出其邻接矩阵
bubuko.com,布布扣
第一步:从①開始,①进集合,用与集合外全部顶点能构成的边中找最小权值的一条边
①——②权6
①——③权1 -> 取①——③边
①——④权5

 

第二步:③进集合,①,③与②,④,⑤,⑥构成的最小边为
①——④权5
③——⑥权4 -> 取③——⑥边

第三步:⑥进集合,①,③,⑥与②,④,⑤构成的各最小边
①——②权6
③——②权5
⑥——④权2 -> 取⑥——④边

第四步:④进集合,①,③,⑥,④与②,⑤构成的各最小边
①——②权6
③——②权5 -> 取③——②边
⑥——⑤权6

第四步:②进集合,①,③,⑥,②,④与⑤构成的各最小边
②——⑤权3 -> 取②——⑤边


这也是在网上找到的一个Kruskal和Prim构造过程图,贴出来:
bubuko.com,布布扣

 

bubuko.com,布布扣

最小生成树(普利姆算法、克鲁斯卡尔算法),布布扣,bubuko.com

最小生成树(普利姆算法、克鲁斯卡尔算法)

标签:c   style   class   a   http   width   

原文地址:http://www.cnblogs.com/mfrbuaa/p/3774659.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!