1.问题
现有一张n个点m条边的加权无向图,向该图中取出一些边构成最小生成树(MST)。最小生成树就是用n个点n-1条边组成一个极小连通子图,要求该生成树上的边权之和最小。问这个无向图的最小生成树的权值为多少。
2.解析
首先使用kruskal算法,该算法的核心思想是贪心,把每个边根据权值从小到大排序,建立一个空图,然后遍历所有的边,当前的边的两个端点如果不在新图上或者在新图上不连通,就把这条边加入新图中,直到出现一棵树。
大概思路如下图:
红色边为最小生成树中的边
最后最小生成树为上图中的红色部分。
3.设计
- 建立并查集,每个点自成一个集合。
- 把所有点按照边权从小到大排序,依次扫描每条边(x,y,z)。
- 若x,y属于同一集合,则跳过这条边。
- 否则合并x,y的集合,并累加z入答案。
- 所有边扫描完或者边数达到n-1,则第四步处理的边构成了最小生成树。
4.复杂度分析
- 初始化并查集结构:O (V)。
- 依照边权排序,考虑快速排序,有E条边,复杂度为O(Elog(E))。
- 对每条边的两个点进行是否连通的判断,需要用到find和union的操作,复杂度为O(Elog(log(V)))。
所以整个算法的复杂度为O(V+Elog(E)+ Elog(log(V))),即O(Elog(E))。