最小生成树之kruskal算法

1.问题

现有一张n个点m条边的加权无向图,向该图中取出一些边构成最小生成树(MST)。最小生成树就是用n个点n-1条边组成一个极小连通子图,要求该生成树上的边权之和最小。问这个无向图的最小生成树的权值为多少。

2.解析

首先使用kruskal算法,该算法的核心思想是贪心,把每个边根据权值从小到大排序,建立一个空图,然后遍历所有的边,当前的边的两个端点如果不在新图上或者在新图上不连通,就把这条边加入新图中,直到出现一棵树。
大概思路如下图:
红色边为最小生成树中的边

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后最小生成树为上图中的红色部分。

3.设计

  1. 建立并查集,每个点自成一个集合。
  2. 把所有点按照边权从小到大排序,依次扫描每条边(x,y,z)。
  3. 若x,y属于同一集合,则跳过这条边。
  4. 否则合并x,y的集合,并累加z入答案。
  5. 所有边扫描完或者边数达到n-1,则第四步处理的边构成了最小生成树。

4.复杂度分析

  1. 初始化并查集结构:O (V)。
  2. 依照边权排序,考虑快速排序,有E条边,复杂度为O(Elog(E))。
  3. 对每条边的两个点进行是否连通的判断,需要用到find和union的操作,复杂度为O(Elog(log(V)))。

所以整个算法的复杂度为O(V+Elog(E)+ Elog(log(V))),即O(Elog(E))。

5.源代码

https://github.com/Geedhayb/Geed/blob/master/kruskal.cpp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值