Kruskal学习笔记
Kruskal 学习笔记
最小生成树
在无向图中,连通且无环的图称为树(Tree)。给定无向图,连接中所有点,且边集是的子集的树称为的生成树(Spanning Tree),而权值最小的生成树称为最小生成树(Minimal Spanning Tree , MST)。s
Kruskal 算法
###介绍
Kruskal算法由Kruskal发明,用于构造MST,它易于编写,而且效率很高。该算法的基本思想是从大到小加入边,是个贪心算法。
证明
思路很简单,为了造出一棵最小生成树,我们从最小边权的边开始,按边权从小到大依次加入,如果某次加边产生了环,就扔掉这条边,直到加入了 条边,即形成了一棵树。
证明:使用归纳法,证明任何时候 K 算法选择的边集都被某棵 MST 所包含。
基础:对于算法刚开始时,显然成立(最小生成树存在)。
归纳:假设某时刻成立,当前边集为 ,令 为这棵 MST,考虑下一条加入的边 。
如果 属于 ,那么成立。
否则, 一定存在一个环,考虑这个环上不属于 的另一条边 (一定只有一条)。
首先, 的权值一定不会比 小,不然 会在 之前被选取。
然后, 的权值一定不会比 大,不然 就是一棵比 还优的生成树了。
所以, 包含了 ,并且也是一棵最小生成树,归纳成立。
(引用自OI-Wiki)
实现
因为需要查询两点是否连通,所以我们这里可以使用并查集进行维护。
算法总共会经历三个流程:
1.读入后,按照从小到大的顺序将边排序
2.遍历排序后的边的数组,如果当前边的左右顶点未连通(两点未在同一集合中),则加入这条边(将两点所在集合合并);如果已经连通,则跳过这条边来考虑下一跳边。
3.若加入的边数等于点数减一,则认为已经形成了一棵MST,跳出循环。
1 | const int MAXN = 5010; //点数范围 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ender's Blog!
评论