概念
最小生成树 $:=$ 一个的子图,满足
- 包含原图所有点
- 满足树特征
- 边权总和最小
实现
Kruscal
贪心
边权升序遍历,只要边的两点未连接,就加边
边权升序用 std::sort
检测点联通性用
并查集
时间复杂度 $O(|E|\log |E|)$,适合稀疏图
Prim
- 随便找一个点作为初始连通分量 $T$
- 找到与一段连通 $T$ 另一端连通 $\bar{T}$ 的边权最小边
- 边加入最小生成树
- 另一端加入 $T$
- 循环 2. 直到 $T$ = 原点集
维护最小边
- 广搜
- 每轮先标记
vis[u] = true,确定当前轮の最小边 - 再在
q中加边,确定下一轮の候选边 vis[u]维护轮数dis[u]打擂台维护最小边- 优先队列对候选边排序优化
时间复杂度 $O(|V|^{2})$,适合稠密图
坑点
- 边权两两不同 $\implies$ 最小生成树唯一
- 最小生成树的边权可能大于未选中的边