目录
最小生成树问题相关定义
连通图
在无向图中,若任意两个顶点之间都有路径相通,则称该无向图为连通图
生成树
是一个极小连通子图,对于n个顶点的图,只有n-1条边
最小生成树(MST)
带权图的一个权值之和最小的生成树
算法
Kruskal算法
克鲁斯卡尔算法(Kruskal)是一种使用贪婪方法的最小生成树算法
算法步骤:
- 将所有边按权值从小到大排序
- 如果加入当前边不形成环,则依次加入边
- 直到加入n-1条边
算法细节
为什么需要不形成环?
存在环说明可以去除边,来得到更小的生成树
如何判断是否形成环?
维护已加入点集合
当前边存在一个点不在集合里,则可以加入
维护终点数组
定义终点为:每个顶点连通的标号最大的点
在每次插入边之后,更新终点数组
如果两个点的终点相同,说明连通,插入边会形成环
并查集
Union-Find 并查集算法,用来高效处理图中连通分量的问题
通过connected判断端点的连通性
算法正确性
是全局最优解吗?
是的
为什么保证是全局最优解?
需要证明
算法复杂度
时间复杂度
主要考虑排序时间O(ElgE)
若E<V^2,有lg|E|=O(lgV)
则时间重新表示为O(ElgV)
Prim算法
算法步骤:
- 任选一个顶点出发
- 从邻边中选择最小的边并保证另一个端点不在集合中,加入该边,并更新已经包含的点的集合
- 直到包含所有的顶点
时间复杂度
O(n^2)
总结
最经典的两个最小生成树算法: Kruskal 算法与 Prim 算法。两者分别从不同的角度构造最小生成树,Kruskal 算法从边的角度出发,使用贪心的方式选择出图中的最小生成树,而 Prim 算法从顶点的角度出发,逐步找各个顶点上最小权值的边来构建最小生成树的。