最小生成树(MST)----普里姆(Prim)算法与克鲁斯卡尔(Kruskal)算法

1、概念给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树.

2、应用例如:要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光缆的总费用最低。这就需要找到带权的最小生成树。

最小生成树(MST)----普里姆(Prim)算法与克鲁斯卡尔(Kruskal)算法_第1张图片

3、求最小生成树的算法

3.1 普里姆(Prim)算法

方法:从指定顶点开始将它加入集合中,然后将集合内的顶点与集合外的顶点所构成的所有边中选取权值最小的一条边作为生成树的边,并将集合外的那个顶点加入到集合中,表示该顶点已连通.再用集合内的顶点与集合外的顶点构成的边中找最小的边,并将相应的顶点加入集合中,如此下去直到全部顶点都加入到集合中,即得最小生成树.

步骤:
第一步:从①开始,①进集合,用与集合外所有顶点能构成的边中找最小权值的一条边

①——②权6
①——③权1 -> 取①——③边
①——④权5

 第二步:③进集合,①,③与②,④,⑤,⑥构成的最小边为

①——④权5
③——⑥权4 -> 取③——⑥边

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

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

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


步骤示意图如下所示:

最小生成树(MST)----普里姆(Prim)算法与克鲁斯卡尔(Kruskal)算法_第2张图片

3.2 克鲁斯卡尔(Kruskal)算法

方法:将图中边按其权值由小到大的次序顺序选取,若选边后不形成回路,则保留作为一条边,若形成回路则除去.依次选够(n-1)条边,即得最小生成树.(n为顶点数)

步骤:

第一步:由边集数组选第一条边,即权值为1的边;

第二步:选第二条边,即权值为2的边;

第三步:选第三条边,即权值为3的边;

第四步:选第四条边,即权值为4的边;

第五步:选第五条边。

步骤示意图如下所示:

最小生成树(MST)----普里姆(Prim)算法与克鲁斯卡尔(Kruskal)算法_第3张图片

4、两个算法的比较

对比两个算法,克鲁斯卡尔(Kruskal)算法 主要是针对边来展开,边数少时效率会非常高,所以对于稀疏图有很大优势;而 普里姆(Prim)算法对于稠密图,即边数非常多时会更好一些。


你可能感兴趣的:(数据结构与算法)