883 字
4 分钟

最小生成树学习记录

前置知识和定义#

在开始学习最小生成树之前,先了解一些前置知识。

子图#

对于一张图 G=(V,E)G=(V,E),如果存在一张图 H=(V,E)H=(V',E') 满足 VVV'\subseteq VEEE'\subseteq E,则称 HHGG 的一个子图。记作 HGH\subseteq G

生成子图#

如果存在 HGH \subseteq G 满足 V=VV'=V,则称 HHGG 的一个生成子图

生成子图又称为支撑子图。

生成树#

生成树:一个无向连通图的生成子图,且同时要求是树。也即在图的边集选择了 n1n-1 条边,将图中的所有顶点连接起来。

最小生成树#

我们定义,一个无向连通图的 最小生成树,是指这个图中边权和最小的生成树。

Kruskal 算法#

Kruskal 算法是一种常见简单的用于求最小生成树的算法。此算法的基本思想就是贪心的从小到大加入边。

算法流程#

  1. 对图中的所有边按边权从小到大排序。
  2. 从小到大枚举每一条边 (u,v)(u,v),如果 uuvv 不在同一连通块中,就加入这条边,并将 uuvv 所在的连通块合并。
  3. 重复步骤 2 直到加入了 n1n-1 条边。

显然,我们需要使用并查集来维护每个点所在的连通块。那么,此算法的时间复杂度就为 O(mlogm)O(m\log m),其中 mm 是边数。

证明#

归纳法证明#

我们使用数学归纳法证明 Kruskal 算法的正确性。

基础:算法开始前,显然成立。

归纳:假设算法在加入了 k1k-1 条边后,生成了一个最小生成树 TT。我们需要证明,加入第 kk 条边 (u,v)(u,v) 后,生成的最小生成树 TT' 也成立。

我们可以分两种情况讨论:

  1. 如果 (u,v)(u,v) 不在 TT 中,那么 TT' 就是 TT 加上 (u,v)(u,v) 这条边。显然,TT' 是一个最小生成树。
  2. 如果 (u,v)(u,v)TT 中,那么 TT' 就是 TT 去掉 (u,v)(u,v) 这条边,加上 (u,v)(u,v) 这条边的最小生成树。根据归纳假设,TT 是一个最小生成树,所以 TT' 也是一个最小生成树。

反证法#

我们使用反证法证明 Kruskal 算法的正确性。

假设 Kruskal 算法得到的生成树 TT 不是最小生成树,那么必然存在某个最小生成树 ToptT_{opt},使得 w(Topt)<w(T)w(T_{opt}) < w(T),其中 w()w(\cdot) 表示生成树的边权和。

ek=(u,v)e_k = (u,v) 是 Kruskal 算法选择的第一个不在 ToptT_{opt} 中的边(按边权从小到大排序后的第 kk 条边)。由于 Kruskal 算法会选择这条边,说明在加入 eke_k 之前,uuvv 不在同一个连通块中。

现在考虑 Topt{ek}T_{opt} \cup \{e_k\},这个图必然包含一个环(因为 ToptT_{opt} 是生成树,加入任何边都会形成环)。这个环中至少包含一条边 ee' 满足 w(e)w(ek)w(e') \geq w(e_k)(因为 eke_k 是连接这两个连通块的最小权边)。

我们可以构造一个新的生成树 T=Topt{ek}{e}T' = T_{opt} \cup \{e_k\} \setminus \{e'\}。显然:

  • TT' 仍然是一个生成树(因为去除了环中的一条边)
  • w(T)=w(Topt)+w(ek)w(e)w(Topt)w(T') = w(T_{opt}) + w(e_k) - w(e') \leq w(T_{opt})(因为 w(ek)w(e)w(e_k) \leq w(e')

但是这与 ToptT_{opt} 是最小生成树的假设矛盾,因为我们找到了一个权值不大于 ToptT_{opt} 的生成树 TT',且 TT' 包含了 eke_k

通过重复这个过程,我们可以证明 Kruskal 算法得到的生成树 TT 必须是最小生成树,从而证明了算法的正确性。

最小生成树学习记录
https://blog.introl.top/posts/图论学习记录/最小生成树学习记录/
作者
Introl
发布于
2025-10-17
许可协议
CC BY-NC-SA 4.0