最小生成树唯一性判定
1. 问题描述
给定一个无向连通图 \(G=(V,E)\),每条边 \(e \in E\) 有权重 \(w(e)\)。我们已求出这个图的一个最小生成树(MST)\(T\)。
问题是:如何判断这个图的最小生成树是否唯一?换句话说,是否存在另一棵不同的生成树 \(T' \neq T\),使得 \(w(T') = w(T)\)?
2. 背景知识
- 最小生成树(MST)的常用算法是 Kruskal 和 Prim,它们可能产生不同的 MST,但总权重相同。
- 如果图中存在多条边连接同一对顶点(多重边),并且权重不同,那么 MST 可能唯一也可能不唯一。
- 更常见的情况是:在构造 MST 的过程中,在某个步骤有多个权重相等的边可选,但选择不同的边可能导致不同的 MST 树形结构,但仅凭有等权边不能断定 MST 不唯一,因为等权边可能在不同的连通分量中,不影响唯一性。
- 真正的不唯一来源于存在另一棵总权重相同的生成树,它与已知 MST 至少有一条边不同。
3. 判定思路
一个经典的判定方法是利用“可替换边”概念:
对于 MST \(T\) 中的每条边 \(e \in T\),从 \(T\) 中删掉 \(e\) 会将树分成两个连通分量。在原来的图 \(G\) 中,连接这两个分量的所有边中,如果存在另一条边 \(e' \notin T\),其权重等于 \(w(e)\),则 \(e\) 可以被 \(e'\) 替换得到另一棵总权重相同的生成树,从而 MST 不唯一。
注意:如果有多条权重相等的非树边能连接这两个连通分量,只要有一条权重和 \(e\) 相等,就已经破坏唯一性。
4. 算法步骤(朴素 \(O(mn)\) 法)
假设我们已经有一个 MST \(T\),有 \(n\) 个顶点,\(m\) 条边。
步骤 1:建立 MST
用 Kruskal 或 Prim 算法求一棵 MST \(T\),存储为边集。
步骤 2:枚举树边
对 \(T\) 中的每条树边 \(e = (u,v)\) 做:
- 从 \(T\) 中删去 \(e\),得到两棵子树 \(A\) 和 \(B\)(通过 DFS/BFS 标记顶点属于哪边)。
- 在原图 \(G\) 的所有非树边中,找连接 \(A\) 与 \(B\) 的边,并记录这些边的最小权重 \(w_{\min\_cross}\)。
- 即对每条非树边 \((x,y)\),如果 \(x\) 在 \(A\),\(y\) 在 \(B\) 或反之,则它横跨这两个连通分量。
- 如果 \(w_{\min\_cross} = w(e)\),则 \(e\) 可被等权非树边替换 ⇒ MST 不唯一,算法结束。
步骤 3:结论
如果检查了所有树边,都没有找到可替换的等权非树边,则 MST 唯一。
5. 复杂度优化 \(O(m \log n)\)
朴素法每次删树边后要重新划分连通块并扫描所有非树边,代价高。
优化方法:利用次小生成树的思想,在 \(O(m \log n)\) 时间内完成。
关键观察:
- 对于非树边 \(e' = (a,b)\),将它加入 MST \(T\) 会形成一个环,环上最大权边如果等于 \(w(e')\),则说明可以用 \(e'\) 替换那条最大边得到另一棵相同权重的生成树。
- 更形式化:
设 \(\text{maxWeight}(a,b)\) 表示在 MST \(T\) 中从 \(a\) 到 \(b\) 的唯一路径上的最大边权重。
如果存在非树边 \(e'\) 使得 \(w(e') = \text{maxWeight}(a,b)\),则 MST 不唯一。
为什么:在 \(T\) 中,路径 \(a \to b\) 上的某条边 \(e_{\max}\) 的权重等于 \(w(e')\),那么删掉 \(e_{\max}\),加入 \(e'\),还是一棵生成树,总权重不变,但结构不同。
6. 优化算法步骤
6.1 求 MST
用 Kruskal 或 Prim 得到 MST \(T\),用邻接表存储。
6.2 预处理树上任意两点间最大边权
- 将 MST 看作一棵树,我们可以用树上倍增法(binary lifting)在 \(O(n \log n)\) 预处理后,\(O(\log n)\) 查询任意两点间路径上的最大边权。
- 定义 \(up[u][k]\) 表示从 \(u\) 向上 \(2^k\) 步到达的祖先。
- 定义 \(maxw[u][k]\) 表示从 \(u\) 到 \(up[u][k]\) 的路径上的最大边权。
- 预处理方法:DFS 遍历树,设根为 1,记录深度、祖先、最大边权。
6.3 检查每条非树边
对原图 \(G\) 的每条非树边 \((u,v,w)\):
- 查询 \(T\) 中 \(u\) 到 \(v\) 路径上的最大边权重 \(M\)(用倍增法 \(O(\log n)\) 得到)。
- 如果 \(M = w\),则 MST 不唯一,结束算法。
6.4 唯一性判断
如果所有非树边都满足 \(w > M\)(严格大于路径最大边权),则 MST 唯一。
7. 正确性证明
- 如果存在另一棵 MST \(T' \neq T\),则 \(T\) 和 \(T'\) 的对称差包含若干条边,每条边在 \(T\) 中或在 \(T'\) 中。
考虑 \(T'\) 中不在 \(T\) 的一条边 \(e'\),将它加入 \(T\) 会形成环,环上必有某条树边 \(e \in T\) 且 \(e \notin T'\)。由切性质,\(w(e') = w(e)\)。
在 MST 中,\(e\) 是 \(T\) 中连接环上两点的路径上的最大边(否则 \(T\) 不是 MST)。
因此存在非树边 \(e'\) 满足 \(w(e') = \text{maxWeight}(u,v)\)。 - 反之,如果存在这样的非树边,替换后就得到另一棵 MST。
8. 时间复杂度
- 求 MST:\(O(m \log n)\)(Kruskal)。
- 预处理倍增数组:\(O(n \log n)\)。
- 对每条非树边查询路径最大边权:\(O(m \log n)\)。
- 总复杂度:\(O(m \log n)\)。
9. 举例
假设图如下(顶点 1~4):
边:
(1,2,1)
(2,3,2)
(3,4,2)
(1,4,3)
(2,4,3)
MST:选边 (1,2,1), (2,3,2), (3,4,2) 总权重 5。
检查非树边:
- (1,4,3):路径 1→4 在 MST 上是 1-2-3-4,最大边权 2。3 > 2,不可替换。
- (2,4,3):路径 2→4 是 2-3-4,最大边权 2。3 > 2,不可替换。
所以唯一。
如果图增加一条边 (1,3,2) 权重 2(原图无)。MST 可能还是选 (1,2,1),(2,3,2),(3,4,2) 总权重 5。
非树边 (1,3,2):在 MST 中路径 1-2-3 最大边权 2,等于 2,那么用 (1,3,2) 替换 (2,3,2) 得到另一棵 MST (1,2,1),(1,3,2),(3,4,2) 权重 5,MST 不唯一。
10. 总结
最小生成树唯一性判定的高效方法是:
- 求出任意一棵 MST \(T\)。
- 预处理 MST 上任意两点间路径的最大边权(倍增法或树链剖分)。
- 检查每条非树边,如果它的权重等于它在 MST 中两端点路径上的最大边权,则 MST 不唯一。
- 如果没有这样的非树边,则 MST 唯一。
这个算法既清晰又高效,是解决该问题的标准方法。