Kruskal
性质: MST增量更新
在处理动态图或增量更新的最小生成树问题时,有一个非常深刻且有用的性质。这个性质是许多优化算法(例如题目 csp-s 2025 T2 道路修复 中可能用到的方法)的理论基础。
性质描述
假设我们有一个边集 em 和另一个边集 es。我们想要计算 em 和 es 并集的最小生成树。该性质指出,我们可以先计算 em 的最小生成树,然后用这个结果和 es 一起计算最终的最小生成树。
用数学公式表达为:
Cost(MST(em∪eS))=Cost(MST(MST(em)∪eS))直观理解
这个性质的直观理解是:
任何不在 em 的最小生成树里的边(我们称之为“无用边”),都因为它在 em 内部的某个环路中是“最差”(最重)的边。
后来加入 es 可能会提供 新 的环路,但这并不会改变那条“无用边”在它 原来 的环路中是“最差”的事实。
既然 em 内部已经有了一条更优的路径(MST(em) 中的路径)来连接那条“无用边”的两个端点,那么在求全局MST时,算法就永远不会选择那条“无用边”,因为它总能找到更优的替代方案。
证明
为了方便,我们定义几个术语:
- Em=MST(em):只使用 em 算出的MST的边的集合。
- Em′=em∖Em:所有 em 中没有被 Em 选中的边(“无用边”)。
- G1=em∪eS=Em∪Em′∪eS: 包含所有边的完整图。
- G2=Em∪eS: 只包含 Em 和新边集的“优化图”。
- T1=MST(G1):完整图的MST(这是我们真正想求的)。
- T2=MST(G2):“优化图”的MST。
我们要证明的是:Cost(T1)=Cost(T2)。
这个证明分为两个部分:
1. 证明 Cost(T1)⩽Cost(T2)
这部分很简单。
- G2 的边集(Em∪eS)是 G1 边集(Em∪Em′∪eS)的一个子集。
- T2 是 G2 的一个最小生成树。
- T2 本身也是 G1 的一个(不一定是最小的)生成树,因为它连接了所有节点。
- T1 是 G1 的最小生成树。根据定义,T1 的成本必须小于或等于 G1 中任何其他生成树的成本。
- 因此,Cost(T1)⩽Cost(T2)。
一句话: 集合大的小
另一种:
- 因为集合G2⊆G1,考虑幂集,得出P(G2)⊆P(G1)
- Cost(T1)本质是符合条件的幂集的最小值
- 任何在P(G2)的最小值都会出现在P(G1)中
- 显然,Cost(T1)⩽Cost(T2)。
2. 证明 Cost(T1)⩾Cost(T2)
这是证明的关键。我们将使用一个“交换论证”(Exchange Argument)。
我们从 T1(完整图的MST)出发,一步一步地把它变成一个只使用 G2 中边的生成树,并且成本不会增加。
分情况讨论:
情况1: 只由G2中的边组成
如果 T1 已经只包含 G2 中的边(即 T1 中没有任何来自 Em′ 的边),那么 T1 本身就是 G2 的一个生成树。因为 T2 是 G2 的 最小 生成树,所以 Cost(T1)⩾Cost(T2)。结合第1部分,我们得到 Cost(T1)=Cost(T2)。
情况2: 先断开,然后重新连
-
如果 T1 中包含了一条(或多条)来自 Em′ 的边,我们任选一条这样的边 e=(u,v)。
- e 在 em 中,但 e∈/Em(e在原图中,但是不在原图MST中)。
- 根据MST的环路性质:将 e 添加到 Em 中,必然会形成一个环路 C。
- 在这个环路 C 中, e 一定是权重最大(或之一)的边。环路 C 上的所有其它边 ei 都满足 Cost(ei)⩽Cost(e),并且所有这些 ei 都在 Em 中。
-
现在,我们回到 T1。T1 是一个树,它包含了 e。
- 如果我们从 T1 中移除 e, T1 会断裂成两个连通分量 A 和 B(u∈A,v∈B)。
- 但是,我们在上面知道 e 所在的环路 C 中,除了 e 之外,还有一条 只由 Em 中的边构成的 路径 P=C∖{e} 也能连接 u 和 v。
- 由于 P 上的所有边都属于 Em,而 T1 也是一个连接所有节点的生成树, T1 不可能包含了 P 上的所有边(否则 T1 中会有一个环)。
- 因此,P 上必定存在至少一条边 ek,它的两个端点分别位于 A 和 B 中。
-
让我们来构造一个新的生成树 T1′=(T1∖{e})∪{ek}。
- T1′ 也是一个生成树(我们断开了 e,又用 ek 连上了)。
- 我们来比较成本:Cost(T1′)=Cost(T1)−Cost(e)+Cost(ek)。
- 因为 ek 在环路 C 上,我们从第2步知道 Cost(ek)≤Cost(e)。
- 因此,Cost(T1′)≤Cost(T1)。
-
我们成功地将 e(一条 Em′ 中的边)替换为了 ek(一条 Em 中的边),并且总成本没有增加(反而可能降低了)。
- 由于 T1 本来就是 最小生成树,它的成本不可能再降低了,所以必定有 Cost(T1′)=Cost(T1)。
- 这意味着 T1′ 也是 G1 的一个最小生成树。
-
我们可以对 T1 中所有来自 Em′ 的边重复这个“交换”过程。最终,我们会得到一个新的最小生成树 T1∗,它具有 Cost(T1∗)=Cost(T1),并且 T1∗ 只包含来自 Em 和 es 的边。
- 换句话说,T1∗ 是一个完全由 G2 中的边构成的生成树。(这就变成了情况1)
-
因为 T1∗ 是 G2 的一个生成树,而 T2 是 G2 的最小生成树,所以 Cost(T2)⩽Cost(T1∗)。
-
结合 Cost(T1∗)=Cost(T1),我们得到 Cost(T2)≤Cost(T1)。
结论
- 在第1部分,我们证明了 Cost(T1)⩽Cost(T2)。
- 在第2部分,我们证明了 Cost(T1)⩾Cost(T2)。
唯一的可能是 Cost(T1)=Cost(T2)。
证明完毕。 这意味着我们可以安全地丢弃所有 Em′ 中的边,只在 Em∪eS 上运行MST算法,这极大地降低了边的数量,从而优化了算法。