最小生成树之Kruskal算法

最小生成树之Kruskal算法,其核心原理也是切分定理
切分定理:
切分
把图中的节点分为两部分,称为一个切分(Cut);
横切边
如果一个边的两个端点,属于切分(Cut)不同的两边,这个边称为横切边(Crossing Edge);
切分定理
给定任意切分,横切边中权值最小的边必然属于最小生成树;

Kruskal算法属于切分定理的逆向应用。

首先将所有的边按从小到大进行排序。
选出最短的边。
在这里插入图片描述

此时最短的边为{0,1}这条边,此时把{0}和{2}看成一个切分,{0,1}这条是横切边且最短,所以将这条加入到最小生成树边中。此时图变为
在这里插入图片描述

然后再找出次短边,因为对边进行排过序,现在只需要O(1)的时间,

在这里插入图片描述

此时找到边是{3,4},此时的切分为{3},{4},这条边是横切边中最短的(虽然只有一条),那么一定是最小生成树中的边,将其加入最小生成树中,此时的图为

在这里插入图片描述

按此算法找到下一条边是{4,5},此时的切分为{3,4}和{5},{4,5}这条边仍为最小横切边,将其加入到最小生成树中。此时图跟新为
在这里插入图片描述

在找下一条边是{2,3},那么此时的切分为{0,2}和{3,4,5},发现这个切分出现了两条横切边{2,3}和{2,4},虽然他们长度相等,那么我们任意选择一条{2,3}作为最短横切边。此时将{2,3}加入到最小生成树中去。那么此时的图可以更新为
在这里插入图片描述

可以看到在最小生成树的内部,还有一条边{2,4},这条边在树的内部构成了环,这就不符合树的要求了。我们现在可以暂时不管他,因为我们对所有的边进行了排序,一定会对所有的边进行遍历,到时候遍历到它的时候在进行处理。
继续遍历下一条边,恰巧是刚刚那条有问题的边{2,4},这条边造成的问题是使得这个图内构成了环。所以这条边需要被舍弃,那么引伸出一个问题,那就是环检测,在学习BFS或者DFS时,我们知道遍历一个图可以检测这个图内是否有环,很明显如果使用BFS或者DFS时间复杂度太高,所以我们使用并查集这个高级数据结构,可以快速判断一图中是否有环。所以我们在每操作一条边的时候都要判断这条边都否构成了环,按照这个算法直到所有顶点都被加入到最小生成树了。

下面是代码实现Kruskal算法

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值