Archipelago

Lec 12贪心算法:最小生成树

讲义完成更新于 2026-09-17

Lec 12 贪心算法:最小生成树(Greedy Algorithms: Minimum Spanning Tree)

TL;DR

  • 最小生成树核心定义:在连通无向带权图 G=(V,E,w)G = (V, E, w) 中寻找一棵跨越所有顶点的无圈无向树 T⊆ET \subseteq E,使得所有树边的权重之和 ∑e∈Tw(e)\sum_{e \in T} w(e) 取得全局极小值。
  • 割性质与环性质两大基石:割性质(Cut Property)指出跨越任意割集的最小权边必然属于某棵 MST,提供“安全加边”判据;环性质(Cycle Property)指出任意简单环上的最大权边必不属于 MST,提供“安全删边”判据。
  • Kruskal 算法与并查集加速:全局边权升序排序后按贪心准则依次试加,利用并查集(按秩合并与路径压缩)在近乎线性的 O(Eα(V))O(E \alpha(V)) 时间内核验环路,总体复杂度受限于排序的 O(Elog⁡V)O(E \log V)。
  • Prim 算法与斐波那契堆:从单顶点出发如水滴扩散逐步扩张连通块,基于斐波那契堆的常数均摊 Decrease-Key 操作,将稠密图上的运行时间优化至理论极限 O(E+Vlog⁡V)O(E + V \log V)。

最小生成树(MST)问题形式化

给定一个连通无向图 G=(V,E)G = (V, E),每条边 e∈Ee \in E 附带实数权重 w(e)w(e)。

定义

生成树与最小生成树(Minimum Spanning Tree, MST) 子图 T=(V,ET)T = (V, E_T) 若满足以下条件,则称为图 GG 的生成树:

  1. ET⊆EE_T \subseteq E 且 ∣ET∣=∣V∣−1|E_T| = |V| - 1;
  2. 子图 TT 连通且不包含任何简单环路。

若存在某棵生成树 TT,其边权总和在所有可能生成树中最小:

w(T)=∑e∈ETw(e)=min⁡T′ 为生成树w(T′)w(T) = \sum_{e \in E_T} w(e) = \min_{T' \text{ 为生成树}} w(T')

则称 TT 为图 GG 的最小生成树。为行文与证明简洁,若无特殊说明,假定图中的边权两两互不相同(此时 MST 唯一存在)。


核心定理:割性质与环性质

所有的贪心 MST 算法(包括 Kruskal、Prim、Borůvka)其正确性均直接建立在割性质与环性质之上。

割与跨越边

定义

图的割(Cut) 无向图顶点集 VV 的一个二划分 (S,V∖S)(S, V \setminus S) 称为图的一个割。若边 e=(u,v)e = (u, v) 满足 u∈Su \in S 且 v∈V∖Sv \in V \setminus S,则称边 ee **跨越(Cross)**该割。

定理 1:割性质(Cut Property)

定理

割性质(安全加边准则) 设 (S,V∖S)(S, V \setminus S) 为图 GG 中的任意一个割。若边 e∗=(u,v)e^* = (u, v) 是所有跨越该割的边中权重严格最小的边,则 e∗e^* 必然属于图 GG 的唯一最小生成树。

证明(置换论证 Exchange Argument): 设 T∗T^* 为图 GG 的最小生成树。假设 e∗∉T∗e^* \notin T^*。

  1. 将边 e∗e^* 加入树 T∗T^*,必然会产生一个唯一的简单环 CC(因为树加上一条非树边必成环);
  2. 边 e∗=(u,v)e^* = (u, v) 跨越了割 (S,V∖S)(S, V \setminus S),其中 u∈S,v∈V∖Su \in S, v \in V \setminus S。因为环 CC 从 uu 出发最终必须返回 uu,该环必然在除 e∗e^* 之外的某个地方再次跨越割 (S,V∖S)(S, V \setminus S)。设另一条跨越割的环边为 e′∈Ce' \in C;
  3. 将边 e′e' 从 T∗∪{e∗}T^* \cup \{e^*\} 中删除,得到一棵新的生成树 T′=T∗∪{e∗}∖{e′}T' = T^* \cup \{e^*\} \setminus \{e'\};
  4. 比较两树的总权重: w(T′)=w(T∗)+w(e∗)−w(e′)w(T') = w(T^*) + w(e^*) - w(e')
  5. 因为 e∗e^* 是跨越该割的严格最小权边,而 e′e' 同样跨越该割且 e′≠e∗e' \neq e^*,故必有 w(e∗)<w(e′)w(e^*) < w(e');
  6. 从而得到 w(T′)<w(T∗)w(T') < w(T^*),这与 T∗T^* 是最小生成树产生不可调和的矛盾! 因此,e∗e^* 必然属于最小生成树。

定理 2:环性质(Cycle Property)

定理

环性质(安全删边准则) 设 CC 为图 GG 中的任意一个简单环路。若边 emax⁡e_{\max} 是环 CC 中权重严格最大的边,则 emax⁡e_{\max} 绝不可能属于图 GG 的任何一棵最小生成树。

证明: 假设 emax⁡=(u,v)e_{\max} = (u, v) 属于某棵最小生成树 T∗T^*。 若将 emax⁡e_{\max} 从 T∗T^* 中移除,树 T∗T^* 将分裂为两个互不相连的连通分量 SS 与 V∖SV \setminus S,其中 u∈S,v∈V∖Su \in S, v \in V \setminus S。 由于在原图 GG 中,环 CC 的剩余部分 C∖{emax⁡}C \setminus \{e_{\max}\} 提供了连接 uu 与 vv 的另一条替代路径,因此环 CC 上必然存在另一条边 e′e' 跨越割 (S,V∖S)(S, V \setminus S)。 将 e′e' 重新加入,构造新生成树 T′=T∗∖{emax⁡}∪{e′}T' = T^* \setminus \{e_{\max}\} \cup \{e'\}。由于 w(e′)<w(emax⁡)w(e') < w(e_{\max}),新树的权重 w(T′)<w(T∗)w(T') < w(T^*),与最优性矛盾。


经典算法:Kruskal 算法与并查集实现

Kruskal 算法采用“森林合并”的视角:初始时每个顶点各成一棵独立的孤立树,算法全局考量所有边,贪心地不断将森林连接为单一生成树。

算法流程

  1. 将图中所有边 EE 按权重升序排序:w(e1)≤w(e2)≤⋯≤w(em)w(e_1) \le w(e_2) \le \dots \le w(e_m);
  2. 初始化空边集合 ET=∅E_T = \emptyset;
  3. 初始化并查集,每个顶点 v∈Vv \in V 执行 Make-Set(v);
  4. 依次遍历每条边 e=(u,v)e = (u, v):
    • 检查 Find-Set(u) 是否等于 Find-Set(v);
    • 若不相等(两端点处于不同连通块,加入该边不会成环):
      • 将 ee 加入 ETE_T;
      • 执行 Union(u, v);
    • 若相等(两端点已在同一连通块,加入会产生环):
      • 由环性质,直接舍弃该边;
  5. 当 ∣ET∣=∣V∣−1|E_T| = |V| - 1 时算法提前终止。

正确性证明与复杂度

  • 正确性:当考虑边 e=(u,v)e = (u, v) 且 u,vu, v 处于不同连通分量时,考虑 uu 所在的连通块 SS。在当前尚未处理的剩余边中,边 ee 是跨越割 (S,V∖S)(S, V \setminus S) 的第一条也是权重最小的可用边,根据割性质,将 ee 纳入生成树必然安全。
  • 复杂度:
    • 边排序时间:O(∣E∣log⁡∣E∣)=O(∣E∣log⁡∣V∣)O(|E| \log |E|) = O(|E| \log |V|);
    • 并查集操作:包含 ∣V∣|V| 次 Make-Set、至多 2∣E∣2|E| 次 Find-Set 和 ∣V∣−1|V|-1 次 Union。总耗时为 O(∣E∣α(∣V∣))O(|E| \alpha(|V|));
    • 总体运行时间为 O(∣E∣log⁡∣V∣)O(|E| \log |V|),瓶颈完全在于初始排序。

经典算法:Prim 算法与优先队列优化

Prim 算法采用“单点生根、向外膨胀”的视角:从任意一个起始顶点出发,始终将当前树视为一个整体,寻找连接树内与树外的最短桥梁。

算法流程

  1. 任意选定源点 s∈Vs \in V,定义当前树顶点集合 S={s}S = \{s\};
  2. 维护优先队列 QQ,其中包含所有不在树中的顶点 v∈V∖Sv \in V \setminus S。每个顶点 vv 的键值 key[v]key[v] 记录其连接至当前树 SS 中任意顶点的最小边权: key[v]=min⁡u∈S,(u,v)∈Ew(u,v)key[v] = \min_{u \in S, (u, v) \in E} w(u, v)
  3. 在每一步循环中:
    • 从优先队列中抽取键值最小的顶点 u=Q.ExtractMin()u = Q.\mathrm{ExtractMin}();
    • 将 uu 纳入树集 SS;
    • 遍历 uu 的所有邻接点 v∈Adj[u]v \in \mathrm{Adj}[u]:
      • 若 v∈Qv \in Q 且 w(u,v)<key[v]w(u, v) < key[v]:
        • 更新父节点指针 π[v]=u\pi[v] = u;
        • 执行 Q.DecreaseKey(v,w(u,v))Q.\mathrm{DecreaseKey}(v, w(u, v))。

正确性与底层优先队列对比

  • 正确性:在每一步循环中,树节点集合 SS 与外部未访问节点 V∖SV \setminus S 构成了一个自然的割。优先队列取出的正是跨越该割的全局最小权重边,由割性质直接保证了每次贪心选择的安全最优性。
  • 数据结构与复杂度权衡:
    • 二叉堆(Binary Heap):
      • Extract-Min 发生 ∣V∣|V| 次,每次耗时 O(log⁡∣V∣)O(\log |V|);
      • Decrease-Key 至多发生 ∣E∣|E| 次,每次耗时 O(log⁡∣V∣)O(\log |V|);
      • 总时间为 O(∣E∣log⁡∣V∣)O(|E| \log |V|),适用于稀疏图(∣E∣≪∣V∣2|E| \ll |V|^2)。
    • 斐波那契堆(Fibonacci Heap):
      • Extract-Min 耗时 O(log⁡∣V∣)O(\log |V|);
      • Decrease-Key 支持均摊 O(1)O(1) 常数时间;
      • 总时间为 O(∣E∣+∣V∣log⁡∣V∣)O(|E| + |V| \log |V|)。对于稠密图(例如 ∣E∣=Θ(∣V∣2)|E| = \Theta(|V|^2)),复杂度达到完美的严格线性 O(∣V∣2)O(|V|^2)。

贪心选择的数学本质:拟阵(Matroid)前瞻

为什么图的最小生成树问题能够用极度短视的局部贪心算法达到全局最优,而诸如最短路有向环、旅行商问题(TSP)却无法使用简单贪心?

Whitney 在 1935 年提出了拟阵理论(Matroid Theory): ::: definition 拟阵(Matroid) 一个拟阵 M=(E,I)\mathcal{M} = (E, \mathcal{I}) 由有限基础集 EE 与其独立子集族 I⊆2E\mathcal{I} \subseteq 2^E 构成,满足:

  1. 遗传性(Hereditary):若 A∈IA \in \mathcal{I} 且 B⊆AB \subseteq A,则 B∈IB \in \mathcal{I};
  2. 交换性(Exchange Property):若 A,B∈IA, B \in \mathcal{I} 且 ∣A∣<∣B∣|A| < |B|,则存在元素 x∈B∖Ax \in B \setminus A 使得 A∪{x}∈IA \cup \{x\} \in \mathcal{I}。 :::

定理

Rado-Edmonds 定理 一个组合优化问题对于任意非负权重赋值,贪心算法均能找到最大(小)权重独立子集的充要条件是:该独立子集族构成一个拟阵。

在最小生成树问题中,基础集为图的边集 EE,独立集为“所有不包含简单环的边子集(即森林)”,这正是数学上的图拟阵(Graphic Matroid)。割性质与环性质正是拟阵基交换性质在图拓扑空间上的几何具象。


我的理解

最小生成树是算法世界中“贪心算法皇冠上的明珠”:

  1. 加边与删边的对偶互通:割性质代表了“自底向上由点及线”的正向建设(Kruskal 与 Prim),环性质代表了“由面及体删繁就简”的反向淘汰(Reverse-Delete 算法)。它们是一体两面的拓扑对称物,共同界定了生成树空间的凸多面体边缘。
  2. 局部短视与全局最优的共谋:贪心选择之所以通常会陷入局部次优陷阱,是因为一般系统的未来约束会被当前决策污染。而在拟阵结构下,历史决策形成的森林结构对剩余边的环路判定是各向同性的,贪心选择所丢弃的边由环性质担保终身无用,从而实现了“步步目光短浅,步步绝对最优”。
  3. 算法工匠精神的性能榨取:从 Kruskal 结合并查集将环路检测降维至反阿克曼常数,到 Prim 结合斐波那契堆将稠密图压进 O(V2)O(V^2),计算机科学家在 MST 上展现的优化技艺,树立了将数据结构内部常数与图论拓扑结构深度咬合的典范。 :::