最小生成树算法--Kruskal精讲(图文并茂)

本文详细介绍了Kruskal算法,一种用于寻找最小生成树的有效算法。通过逐步解析算法流程,展示了如何从连通图中选取边,以确保最终生成的树具有最小总权重。文章还提供了算法的简单证明,采用归纳法和反证法,证实了Kruskal算法对任意阶图的适用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Kruskal算法
1.概览

Kruskal算法是一种用来寻找最小生成树的算法,由Joseph Kruskal在1956年发表。用来解决同样问题的还有Prim算法和Boruvka算法等。三种算法都是贪婪算法的应用。和Boruvka算法不同的地方是,Kruskal算法在图中存在相同权值的边时也有效。

2.算法基本思想

假设 WN=(V,{E}) 是一个含有 V个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:先构造一个只含 V个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有 V棵树的一个森林。之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,也就是说,将这两个顶点分别所在的两棵树合成一棵树;反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类推,直至森林中只有一棵树,也即子图中含有 V-1条边为止。
步骤如下:

1)记Graph中有V个顶点,E个边
2)新建图Graphnew,Graphnew中拥有原图中相同的E个顶点,但没有边
3)将原图Graph中所有E个边按权值从小到大排序
4)循环:从权值最小的边开始遍历每条边直至图Graph中所有的节点都在同一个连通分量中
                if 这条边连接的两个节点于图Graphnew中不在同一个连通分量中
                           添加这条边到图Graphnew中
图例描述:

首先第一步,我们有一张图Graph,有若干点和边
在这里插入图片描述
将所有的边的长度排序,用排序的结果作为我们选择边的依据。这里再次体现了贪心算法的思想。资源排序,对局部最优的资源进行选择,排序完成后,我们率先选择了边AD。这样我们的图就变成了下图
在这里插入图片描述
在剩下的图中寻找。我们找到了CE。这里边的权重也是5
在这里插入图片描述
依次类推我们找到了6,7,7,即DF,AB,BE。
在这里插入图片描述
下面继续选择, BC或者EF尽管现在长度为8的边是最小的未选择的边。但是现在他们已经连通了(对于BC可以通过CE,EB来连接,类似的EF可以通过EB,BA,AD,DF来接连),所以不需要选择他们。类似的BD也已经连通了(这里上图的连通线用红色表示了)。
最后就剩下EG和FG了。当然我们选择了EG。最后成功的图就是下图:
在这里插入图片描述

3.简单证明Kruskal算法

对图的顶点数n做归纳,证明Kruskal算法对任意n阶图适用。

归纳基础:

n=1,显然能够找到最小生成树。

归纳过程:

假设Kruskal算法对n≤k阶图适用,那么,在k+1阶图G中,我们把最短边的两个端点a和b做一个合并操作,即把u与v合为一个点v’,把原来接在u和v的边都接到v’上去,这样就能够得到一个k阶图G’(u,v的合并是k+1少一条边),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’的生成树。所以W(T-{<u,v>})<=W(T’),也就是W(T)<=W(T’)+W(<u,v>)=W(T’+{<u,v>}),产生了矛盾。于是假设不成立,T’+{<u,v>}是G的最小生成树,Kruskal算法对k+1阶图也适用。

由数学归纳法,Kruskal算法得证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值