最小生成树

1199 字
6 分钟
最小生成树

最小生成树(MST)#

MST 定义#

最小生成树(Minimum Spanning Tree, MST)是连通图的生成树中权值之和最小的一棵。

  • n 个顶点的连通图,生成树有 n-1 条边
  • MST 可能不唯一(存在等权边时),但总权值唯一
  • 若图不连通,则不存在 MST

切割定理(Cut Property)#

设 S 为图 G 中任意一个顶点子集,在所有连接 S 内顶点与 S 外顶点的边中,权值最小的一条一定属于某棵 MST。这是 Prim 和 Kruskal 算法的理论基础。


Prim 算法(逐顶点扩展)#

核心思想#

从一个顶点出发,每次将离当前生成树最近的顶点加入树中,逐步扩展。

  • 贪心策略:每一步选择连接树内顶点与树外顶点的权值最小的边
  • 逐顶点生长:每次加入一个顶点,共执行 n-1 轮
  • 辅助数组lowcost[] 记录树外各顶点到树的最短距离,closest[] 记录对应的树内顶点

算法过程#

  1. 初始化:选取起始顶点加入 U,用邻接矩阵初始化 lowcost[]closest[]
  2. 循环 n-1 次:
    • lowcost[] 中找到值最小且未加入树的顶点 k
    • 将 k 加入 U(标记 lowcost[k] = 0
    • 扫描 k 的所有邻接顶点 j,若 cost[k][j] < lowcost[j],则更新 lowcost[j]closest[j]

复杂度分析#

指标复杂度说明
时间复杂度O(V2)与边数无关
空间复杂度O(V)lowcost[]、closest[]、visited[]
堆优化O(E log V)使用优先队列,适合稀疏图

Kruskal 算法(按边贪心)#

核心思想#

把所有边按权值从小到大排序,依次选取,只要不形成回路就保留。当选够 n-1 条边时算法结束。

  • 按边贪心:对所有边按权值升序排序,依次选取最小权值边
  • 并查集判环:若边的两个端点已属于同一连通分量,则加入该边会形成回路,跳过
  • 选够 n-1 条边时结束

算法过程#

  1. 将图中所有边按权值升序排序
  2. 初始化并查集,每个顶点各自为一个独立集合
  3. 依次遍历排序后的边 (u, v, w):
    • 若 u 和 v 不在同一集合,选中该边,合并两个集合
    • 若 u 和 v 在同一集合,跳过该边
  4. 当选中的边数达到 n-1 时,MST 构建完成

并查集在 Kruskal 中的作用#

并查集(Union-Find)是 Kruskal 算法高效判环的关键数据结构:

操作功能优化策略
Find(x)查找 x 所在集合的根路径压缩:查找时将沿途节点直接挂到根上
Union(x, y)合并 x 和 y 所在的集合按秩合并:将矮树挂到高树上

若边 (u, v) 的两个端点已在同一集合中,说明 u 到 v 之间已存在路径,再加入该边必然形成回路。

复杂度分析#

步骤时间复杂度说明
边排序O(E log E)快速排序
初始化并查集O(V)每个顶点独立集合
遍历边 + 并查集操作O(E * α(V))α(V) 近似常数
总计O(E log E)瓶颈在排序

Prim vs Kruskal 对比#

对比项PrimKruskal
策略逐顶点扩展按边贪心
时间复杂度O(V2)O(E log E)
适用场景稠密图(边多)稀疏图(边少)
主要数据结构邻接矩阵 + lowcost[]/closest[]边集数组 + 并查集
初始状态从一个顶点开始从所有边开始
判环方式通过 visited 数组区分树内/外通过并查集判断
瓶颈每轮找最小值 O(V)排序 O(E log E)

易错:Prim 的时间复杂度 O(V2) 与边数无关,适合稠密图。Kruskal 的时间复杂度 O(E log E) 取决于边数,适合稀疏图。408 选择题常问”对稀疏图/稠密图分别应选哪种 MST 算法”。


MST 的性质#

  1. 不唯一性:当存在权值相同的边时,MST 可能不唯一(但总权值唯一)
  2. 边数固定:n 个顶点的 MST 恰好有 n-1 条边
  3. 切割定理:连接任意切割的最小权边一定属于某棵 MST
  4. 回路性质:任意回路中权值最大的边一定不属于某棵 MST

考研高频考点#

  • Prim 算法的执行过程手动模拟(给图求 MST)
  • Kruskal 算法的执行过程手动模拟
  • Prim vs Kruskal 的适用场景对比(简答题必考)
  • 时间复杂度 O(V2) vs O(E log E) 的推导
  • MST 的性质:不唯一性、总权值唯一、切割定理
  • 并查集 Find 和 Union 操作原理(常结合 Kruskal 考察)
  • 判断给定图是否存在 MST(图必须连通)

关联页面#

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

最小生成树
https://lingluoa.icu/posts/数据结构/minimum-spanning-tree/
作者
lingluoa
发布于
2026-07-07
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
lingluoa
Hello, I'm lingluoa.
公告
欢迎来到我的博客!不定期更新中。
文章目录
标签
站点统计
文章
53
分类
9
标签
75
总字数
175,771
运行时长
0
最后活动
0 天前
站点信息
构建平台
ESA Pages
博客版本
Firefly v6.15.6
文章许可
CC BY-NC-SA 4.0