您的位置:首页 > 其它

最小生成树之克鲁斯卡尔(Kruskal)算法、普里姆(prim)算法

2012-01-04 11:09 549 查看
问题描述:
在一个具有几个顶点的连通图G中,如果存在子图G'包含G中所有顶点和一部分边,且不形成回路,则称G'为图G的生成树,其中代价最小的生成树则称为最小生成树。例如,设有下图G, 找出连接图G所有顶点(v1,v2,v3,v4,v5,v6)的边,且这些边的权重之和最小。那么如何生成该最小生成树呢?两个经典算法是普里姆(Prim)算法和克鲁斯卡(Kruskal )算法。



克鲁斯卡尔(Kruskal)算法:



克鲁斯卡尔(Kruskal)算法是以图上的边为出发点依据贪心策略逐次选择图中最小边为最小生成树的边,且所选的当前最小边与已有的边不构成回路。在图G中,首先选择最小的边(V2,V3),(V4,V5),(V2,V4),因为(V4,V6)和(V5,V6)权重相等,所以可以任选其中一条(这也表明最小生成树不是唯一的)。同样的道理,选择权重为5的边(V3,V5)(V2,V1),因为(V3,V5)和(V2,V3),(V2,V4),(V4,V5)构成了回路,所以舍弃(V3,V5)保留(V2,V1)。这时该子图G‘已经包含了图G的所有的边,算法结束。得到的最小生成树如下图:



伪代码: Kruskal(G,W)
1、按照权重从小到大顺序排序G的边{e1,e2,e3,e4,e5,...,em};
2、for i = 1to m do
3、如果ei的两个端点不在同一个连通分支,则将ei加到T中;
算法特点:
时间复杂度为O(eloge)(e为网中边数),适合于求稀疏的网的最小生成树。

普里姆(Prim)算法 :

普里姆(Prim)算法是 以图上的顶点为出发点,逐次选择到最小生成树顶点集距离最短的顶点为最小生成树的顶点,并加入到该顶点集,直到包含所有的顶点。在图G中,选择顶点V1加入到顶点集S,连接S中顶点的边为(V1,V2)(V1,V3),选择最小的即(V1,V2),并将V2加入到顶点集S。同样的方法,连接顶点集S的边有(V1,V3)(V2,V3)(V2,V5)(V2,V4),选择最小的(V2,V3),并将V3加入到顶点集S。依次选择得下图:



伪代码:Prim(G,E,W)



算法特点:

时间复杂度为O(n²),适合于求边稠密的最小生成树。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: