最小生成树
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[]记录对应的树内顶点
算法过程
- 初始化:选取起始顶点加入 U,用邻接矩阵初始化
lowcost[]和closest[] - 循环 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 条边时结束
算法过程
- 将图中所有边按权值升序排序
- 初始化并查集,每个顶点各自为一个独立集合
- 依次遍历排序后的边 (u, v, w):
- 若 u 和 v 不在同一集合,选中该边,合并两个集合
- 若 u 和 v 在同一集合,跳过该边
- 当选中的边数达到 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 对比
| 对比项 | Prim | Kruskal |
|---|---|---|
| 策略 | 逐顶点扩展 | 按边贪心 |
| 时间复杂度 | 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 的性质
- 不唯一性:当存在权值相同的边时,MST 可能不唯一(但总权值唯一)
- 边数固定:n 个顶点的 MST 恰好有 n-1 条边
- 切割定理:连接任意切割的最小权边一定属于某棵 MST
- 回路性质:任意回路中权值最大的边一定不属于某棵 MST
考研高频考点
- Prim 算法的执行过程手动模拟(给图求 MST)
- Kruskal 算法的执行过程手动模拟
- Prim vs Kruskal 的适用场景对比(简答题必考)
- 时间复杂度 O(V2) vs O(E log E) 的推导
- MST 的性质:不唯一性、总权值唯一、切割定理
- 并查集 Find 和 Union 操作原理(常结合 Kruskal 考察)
- 判断给定图是否存在 MST(图必须连通)
关联页面
- 图的基本概念与存储结构 — 图的存储是 MST 算法的基础
- 查找 — 并查集(Union-Find)在 Kruskal 算法中的应用
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
图的基本概念与存储结构
数据结构2026-07-07
2
图的遍历
数据结构2026-07-07
3
最短路径与拓扑排序
数据结构2026-07-07
4
B 树与 B+ 树
数据结构2026-07-07
5
红黑树
数据结构2026-07-06
随机文章随机推荐










