最小生成树:Kruskal算法

Kruskal算法是一种寻找带权无向图最小生成树的贪心算法,通过按权值从小到大选取边并利用并查集判断是否形成环来构建MST。本文详细介绍了算法思想、过程、证明以及程序实现,并提供了USACO和POJ的例题分析。
摘要由CSDN通过智能技术生成

最小生成树:Kruskal算法

概览

Kruskal算法(克鲁斯卡尔算法)是一种用来寻找最小生成树的算法,由Joseph Kruskal在1956年发表。Kruskal算法是基于贪心的思想得到的。Kruskal算法在图中存在相同权值的边时有效。

问题

给定一个无向图,如果它任意两个顶点都联通并且是一棵树,那么我们就称之为生成树(Spanning Tree)。如果是带权值的无向图,那么权值之和最小的生成树,我们就称之为最小生成树(MST, Minimum Spanning Tree)。
由Kruskal算法,我们可以求得带权无向图的最小生成树的权值之和。

算法描述

算法思想

Kruskal算法是基于贪心的思想得到的。首先把所有的边按照权值先从小到大排列,接着按照顺序选取每条边,如果这条边的两个端点不属于同一集合,那么就将两个集合合并,直到所有的点都属于同一个集合为止。合并到一个集合时可以使用并查集优化。换言之,Kruskal算法就是基于并查集的贪心算法。

算法过程

  1. 记图中有V个顶点,E条边。
    Kruskal算法图1
  2. 将所有边按权值从小到大排序。排序完成后,我们选择边AD,这样我们的图就变成了下图。
    Kruskal算法图2
  3. 在剩下的边里继续寻找权值最小的,这里找到了CE,它的权值也是5。
    Kruskal算法图3
  4. 依此类推找到DF,AB,BE。
    Kruskal算法图4
  5. 下面继续选择到BC或EF。尽管现在长度为8的边是最小的未选择的边,但现在它们已经连通了(对于BC可以通过CE,EB连接,对于EF可以通过EB,BA,AD,DF连接),所以不需要选择BC或EF。类似地,BD也不需要选择。最后剩下EG和FG,选择权值更小的EG。
    Kruskal算法图5

算法的简单证明

对图的顶点数n做归纳,证明Kruskal算法对任意n阶图适用:
当n=1时,显然能够找到最小生成树。
假设Kruskal算法对n=k阶图适用,那么,在k+1阶图G中,把权值最小的边的两个端点u和v做合并操作,即把u与v合为一个点v',把原来接在u和v的边都接到v'上去,这样就能够得到一个k阶图G'G'的最小生成树T'可以用Kruskal算法得到。
下证T'+{<u,v>}是G的最小生成树。
用反证法,如果T'+{<u,v>}不是最小生成树,设最小生成树是T,即W(T)<W(T'+{<u,v>})。显然T应该包含<u,v>,否则,可以用<u,v>加入到T中,删除环上原有的任意一条边,形成一棵更小权值的生成树,而T-{<u,v>}G'的生成树(因为G'就是由G中的u,v两点合并产生的),所以W(T')≤W(T-{<u,v>}),即W(T'+{<u,v>})≤W(T)。与W(T)<W(T'+{<u,v>})矛盾。假设不成立。所以T'+{<u,v>}是G的最小生成树,Kruskal算法对k+1阶图也适用。
由数学归纳法,Kruskal算法得证。

程序代码

#include <iostream>
#include <algorithm>
using nam
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值