Skip to content

选型与应用场景

基于通用算法套路 · 核于 2026-07

速查

  • 选型第一准则:看图的稀疏程度——稀疏图(E ≪ V²)选 Kruskal(排序代价小),稠密图(E ≈ V²)选 Prim 朴素 O(V²)(避开 log 因子,常数极小)。
  • Kruskal 何时占优:E 较小(如 E = O(V)),O(E log E) 远小于 O(V²),且天然用边集数组(输入就是边列表),省去建图。
  • Prim 何时占优:E 接近 V²(如完全图 V(V−1)/2 条边),堆优化 O(E log V) ≈ O(V² log V) 反而比朴素 O(V²) 慢——此时邻接矩阵朴素版最优,常数小且不依赖 E。
  • 图不连通怎么办:没有生成树,只能求最小生成森林(每个连通分量一棵 MST);Kruskal 自然得到(选不满 n−1 条停),Prim 需对每个未访问分量重启。
  • MST 唯一性:边权全互异时 MST 唯一;存在相等权值时可能有多棵总权相同的 MST——判唯一性看「同权边是否构成可替代的环」。
  • Kruskal 与 Prim 结果关系:两者都能得到 MST;权唯一时边集合相同,权有相等时边集合可能不同但总权值必然相同
  • 应用领域:①网络设计(光缆/电网/管道连通,最低成本);②聚类(删掉 MST 中最大的 k−1 条边得 k 个簇);③近似 TSP(MST 权 ≤ 最优 TSP,作为下界/近似解);④图像分割(基于像素相似度的 MST)。
  • 避坑:无向图边要双向处理(邻接表/Kruskal 边表别漏);Kruskal 别忘 find 判同根;Prim 堆要跳过已选顶点;输入可能含重边/自环(Kruskal 自然处理,Prim 取最小权边)。
  • 复杂度公式:Kruskal O(E log E);Prim 堆 O(E log V),Prim 矩阵朴素 O(V²)

一、稀疏 vs 稠密:选型的核心

MST 选型本质是一道关于 E 与 V² 大小关系的算术题。三种主流实现的复杂度:

实现复杂度何时最优
KruskalO(E log E)E 小(稀疏图)
Prim 堆优化O(E log V)中等稠密度 / 通用
Prim 邻接矩阵朴素O(V²)E 接近 V²(稠密图)

判断逻辑:

  • 稀疏图(E ≪ V²,典型 E = O(V)):Kruskal 的 O(E log E) 极小(如 E = V,则 O(V log V));Prim 矩阵朴素 O(V²) 浪费(要扫大量不存在的边)。选 Kruskal。此时 Kruskal 还有个隐性优势——边集数组就是输入本身,不用先建邻接表。
  • 稠密图(E ≈ V²,典型完全图 E = V(V−1)/2):Prim 堆优化 O(E log V) ≈ O(V² log V),反而比朴素 O(V²) 多一个 log 因子;而朴素版每轮 O(V) 扫描找最小,常数极小、不依赖 E。选 Prim 矩阵朴素
  • 中等稠密度 / 不确定:Prim 堆优化 O(E log V) 是通用兜底;竞赛里 Kruskal 因代码短也常被无脑套用。

记忆口诀:「边少选 Kruskal(排序省事),边多选 Prim(矩阵朴素稳)」

二、图不连通:最小生成森林

MST 的前提是图连通。若图有多个连通分量,求不出「一」棵覆盖所有顶点的生成树,只能求最小生成森林——每个连通分量各一棵 MST。

  • Kruskal:天然得到森林——扫完所有边后若选中数 cnt < n−1,说明有 n − 1 − cnt 个分量没连起来,已选的边就是森林(每个分量内部是它的 MST)。
  • Prim:需要对每个未访问的顶点重新启动一次(外层套一个 for 检测未访问分量),各次结果累加。

判连通性可以前置(DFS/BFS/并查集数连通分量),也可以直接在 MST 算法里靠 cnt < n−1 检测。

三、MST 的唯一性

一个图的 MST 可能不唯一

  • 边权全互异(无两条边权相等):MST 唯一。Kruskal 和 Prim 得到的边集合完全一致。
  • 存在相等权值:可能有多棵总权相同的 MST。例如一个三角形三边权都是 1,任选两条都是 MST,共 3 种。

判唯一性的方法(面试常考):

  1. 充分必要条件:MST 唯一 ⟺ 对任意一个权值,把该权值的所有边同时加入 MST 候选时,它们在 MST 中「应有的位置」不构成可替代的环。
  2. 实用判法:先求出一棵 MST,再检查每条非树边——若它加入后形成的环上存在与它权值相等的边,则 MST 不唯一(可替换)。

注意:即便 MST 不唯一,所有 MST 的总权值必然相同(否则「最小」就矛盾了)。

四、应用场景

MST 不只是竞赛题,它在工程上有大量真实应用:

1. 网络设计(最经典)

「用最低成本把一群节点连通」——这是 MST 的直接模型:

  • 城市间架通信光缆 / 输电网 / 自来水管,每条线路造价不同,求连通所有城市且总造价最低 → MST。
  • 电路板布线、PCB 走线、芯片引脚互连的最小成本方案。
  • 给村庄通水通电通路、传感器网络(无线传感网把数据汇聚)。

2. 聚类(Single-Linkage 层次聚类)

MST 可用于聚类:先对所有点构建完全图(边权 = 两点距离),求 MST,然后删掉 MST 中权最大的 k−1 条边,剩下的森林就是 k 个簇。这种「单链接层次聚类」简单高效,对噪声敏感是其缺点(链式效应)。

3. 近似旅行商问题(TSP)

TSP(旅行商,求访问所有城市的最短回路)是 NP-hard,但 MST 给出了一个下界近似解

  • 下界:最优 TSP 回路长度 ≥ MST 权(删掉 TSP 回路任一条边就是一棵生成树,权 ≥ MST 权)。
  • 2-近似:对 MST 做 DFS 先序遍历得到的回路长度 ≤ 2 × 最优 TSP(满足三角不等式时)。

4. 图像分割

把图像每个像素当顶点、相邻像素相似度的倒数当边权,求 MST 后按阈值切断大权边,可实现对图像的区域分割。

五、选型决策清单

按以下顺序决策:

  1. 图连通吗?不连通 → 求最小生成森林(每个分量一棵)。
  2. 图是稀疏还是稠密?稀疏(E ≪ V²)→ Kruskal;稠密(E ≈ V²)→ Prim 矩阵朴素
  3. 输入是什么形式?边列表 → Kruskal 天然契合;邻接矩阵 → Prim 朴素;邻接表 → 任选(Kruskal 更短)。
  4. 代码量敏感(竞赛/面试手写)?Kruskal 更短(排序 + 并查集)。
  5. 问唯一性?边权全互异则唯一;否则检查非树边是否与环上等权边可替代。

交互演示

下一步

理解了选型与应用后,下一步是查阅代码模板、复杂度表与易错点清单做收尾——速查速用,见参考