最小度限制生成树(Minimum Degree Spanning Tree, MDST)
题目描述
给定一个无向连通图 \(G = (V, E)\),每条边可能有非负权重(也可视为无权图)。目标是找到图 \(G\) 的一棵生成树 \(T\),使得 \(T\) 中所有顶点的最大度数(即树中顶点的最大邻居数)尽可能小。换句话说,我们希望生成树的“度”尽可能均匀,避免出现高度数顶点。这是一个 NP-Hard 问题,但存在一些有效的启发式算法和近似算法。这里我们聚焦于一个经典的 2-近似算法(即度数最多为最优解的 2 倍加 1),并解释其步骤。
解题过程
1. 问题形式化
输入:无向连通图 \(G = (V, E)\),\(|V| = n\),\(|E| = m\)。目标:找到生成树 \(T\),最小化 \(\Delta(T) = \max_{v \in V} \deg_T(v)\),其中 \(\deg_T(v)\) 是 \(v\) 在 \(T\) 中的度数。
由于精确求解困难,我们追求近似解。一个简单想法是:任何生成树的最大度数至少为 \(\lceil 2(n-1)/n \rceil = 2\)(因为树有 \(n-1\) 条边,总度数和为 \(2(n-1)\),平均度数略小于 2)。但某些图(如星形图)的最优解度数可能是 \(n-1\),因此我们需要算法能处理高度数情况。
2. 核心思路:基于最小生成树(MST)的局部改进
算法不直接求解 MDST,而是解决一个相关且更容易的问题:最小度限制生成树(MDST with degree bound)。即给定度数上限 \(B\),判断是否存在一棵生成树,其最大度数 ≤ \(B\)。如果能在多项式时间内对任意 \(B\) 判断“是否存在”,则可用二分查找找到最小 \(B\)。
但判断是否存在度数 ≤ \(B\) 的生成树也是 NP-Hard。不过,我们能找到一种构造方法,使得生成的树度数 ≤ \(2B + 1\)(当 \(B\) 是最优解的最小可能度数时)。核心步骤如下:
- 从图 \(G\) 的任意生成树(如最小生成树)开始。
- 不断寻找“高度数”顶点,并尝试通过边的交换(edge swap)来减少它的度数,同时不增加其他顶点的度数超过某个界限。
3. 算法详细步骤
算法名称:MDST 的 2-近似算法(基于局部搜索与边交换)
-
步骤 0:初始化。
找到任意一棵生成树 \(T\)(例如用 Kruskal 或 Prim 算法得到的最小生成树)。计算 \(T\) 中每个顶点的度数 \(\deg_T(v)\)。
设定一个目标度数上限 \(B\)。我们不知道最优的 \(B^*\),但可以尝试从某个较小的 \(B\) 开始(例如 \(B = 2\)),逐渐增加,直到算法成功。为了讲解,我们假设我们正在尝试一个特定的 \(B\)。 -
步骤 1:检查是否有顶点度数 > \(B\)。
如果所有顶点度数 ≤ \(B\),则成功,输出 \(T\)。
否则,任选一个度数 > \(B\) 的顶点 \(v\)。 -
步骤 2:尝试减少 \(v\) 的度数。
考虑 \(v\) 在 \(T\) 中的某条邻边 \(e = (v, u)\)。我们希望用另一条不在 \(T\) 中的边 \(f\) 替换 \(e\),使得:- 删除 \(e\) 后,\(T - e\) 变成两棵子树 \(T_1\) 和 \(T_2\)(假设 \(v\) 在 \(T_1\) 中)。
- 选择一条非树边 \(f = (x, y)\) 满足 \(x \in T_1\),\(y \in T_2\),且 \(f\) 连接这两棵子树(从而 \(T - e + f\) 仍是生成树)。
- 交换后,\(v\) 的度数减少 1(因为 \(e\) 被移除)。
- 新增顶点 \(x\) 和 \(y\) 的度数各自增加 1,但它们的度数必须仍然 ≤ \(B + 1\)(或 ≤ \(B\),取决于具体界限,算法允许略超过 B)。
这样的交换称为 可行交换。
-
步骤 3:如果存在可行交换,执行它,更新 \(T\),然后返回步骤 1。
如果对 \(v\) 的所有邻边 \(e\) 都不存在可行交换,则尝试增加 \(B\) 或报告失败(在近似算法中,我们允许适度超过 B)。
4. 近似保证
可以证明,如果最优解的最小可能最大度数是 \(B^*\),那么上述算法能找到一棵生成树,其最大度数 ≤ \(2B^* + 1\)。证明思路是利用图论中的“树分解”和“平均论证”:当无法对高度数顶点进行交换时,意味着与它相关的结构迫使某些其他顶点度数必须较大,从而导出矛盾除非当前树的度数已接近 \(2B^* + 1\)。
在实际实现中,我们通常用二分搜索来尝试不同的 \(B\) 值,对每个 \(B\) 运行上述交换过程。如果对某个 \(B\) 算法成功(即经过有限步交换后所有顶点度数 ≤ \(B\)),则记录该 \(B\) 并尝试更小的 \(B\);如果失败(可能进入循环或无法改进),则增加 \(B\)。最终找到的 \(B\) 满足 \(B \leq 2B^* + 1\)。
5. 举例说明
考虑一个简单图:四个顶点 \(a,b,c,d\) 组成一个环 \(a-b-c-d-a\),且所有边权重相等。初始生成树 \(T\) 可以是路径 \(a-b-c-d\)(度数分别为 1,2,2,1)。最大度数 = 2,已是最优(因为任何生成树都有两个度数为 2 的顶点)。但如果初始生成树是星形(a 连接 b,c,d),则 a 的度数 = 3。假设我们设置 \(B=2\),发现 a 的度数 3 > 2。尝试交换:取边 (a,b),删除它后子树为 {a} 和 {b,c,d},寻找非树边连接这两部分,比如 (b,c) 已在树中不可用,但 (a,d) 是非树边,加入 (a,d) 后 a 度数仍为 3(没减少)。继续尝试,最终可通过一系列交换得到路径树,度数降为 2。
6. 复杂度与小结
- 每次边交换可在 \(O(m)\) 时间内检查(检查所有非树边)。
- 最多进行 \(O(nB)\) 次交换(因为每次交换减少某个顶点度数)。
- 总时间复杂度大约 \(O(nm \cdot B)\),在 \(B\) 不大时可接受。
- 这是一个经典的理论算法,展示了如何通过局部改进来逼近 NP-Hard 问题。
关键点:这个算法的核心是“用边交换减少高度数顶点度数”,并在无法减少时证明当前度数已接近最优解的两倍。尽管是近似算法,但提供了理论保证,且思路可用于实际启发式改进。