两种基础的最小生成树算法的学习和区分可看视频
最小生成树(Kruskal(克鲁斯卡尔)和Prim(普里姆))算法动画演示_哔哩哔哩_bilibili
一、 Kruskal算法
时间复杂度是 O(mlogm), n 表示点数,m 表示边数
先将所有边权排序,再从小到大一个个加入边,一旦形成环,该边就被抛弃,当加入了(n-1)条边时,则最小生成树创建完成
用并查集来维护是否形成环
二、 Prim算法
朴素版时间复杂度是 O(n2+m), n 表示点数,m 表示边数
优先队列优化版:时间复杂度 O(mlogn)
利用了贪心的思想,
首先先将起点入队,更新相邻的边,minDist存储相邻最小值,并将被更新的边入队,接下来继续选择权值最小的边,parent记录更新其的点
三、Kruskal重构树
1. kruskal的简单应用
- Kruskal重构树能够更快有效解决一些静态的树剖问题,而且复杂度还很优秀。
例:求两点之间的权重最大的边的最小值,或者最小的最大值问题
- 建树过程可以参考以下文章,图表示得非常清楚
acm-Kruskal重构树学习笔记_&*^*&的博客-CSDN博客
- 求最大最小值:权重从小到大排序建树,则两个点的最近公共祖先点则为答案。
- 求最小最大值:权重从大到小排序建树,同理,两个点的最近公共祖先点则为答案。