寻找最小度生成树(Minimum Degree Spanning Tree, MDST)的近似算法
1. 问题描述
给定一个无向连通图 \(G = (V, E)\),每条边可能有权重(通常考虑加权情况),也可能没有(即非加权图)。
我们要找一棵生成树 \(T\),使得这棵生成树中顶点的最大度数尽可能小。
形式化定义:
设 \(\deg_T(v)\) 表示在生成树 \(T\) 中顶点 \(v\) 的度数。
最小度生成树(MDST)问题是找到一棵生成树 \(T^*\) 使得:
\[\Delta(T^*) = \max_{v \in V} \deg_T(v) \]
在所有生成树中最小。
2. 问题难度与近似算法背景
这是一个NP-hard问题(即使对无权重图)。
- 如果要求所有顶点度数 ≤ 2,那就是哈密顿路径问题,是NP完全的。
- 因此,通常寻求近似算法,在多项式时间内得到一个最大度数不超过最优解 \(\Delta^*\) 乘以某个常倍数的生成树。
常见目标:
设计一个算法,输出生成树的最大度数 \(\Delta \leq \Delta^* + c\) 或 \(\Delta \leq 2\Delta^* + c\) 等形式,其中 \(c\) 是一个小常数。
3. 思路引导:从匹配到树
一个重要观察:
在任意生成树中,叶子节点(度=1)不影响最大度数,我们主要关注度数大的顶点。
如果我们能控制“高度数顶点”的数量,并让它们尽量用较少的边连接到其他部分,就可能降低最大度数。
一个经典思想:
先用某种方法构造一个“好”的子图,再将其扩展为生成树,同时控制度数增长。
4. 近似算法(Furer & Raghavachari 1991 风格)
这里介绍一个简单、直观的局部搜索近似算法,它能给出一个很强的近似保证:
\[\Delta \leq \Delta^* + 1 \]
即最大度数最多比最优解大 1。
4.1 算法步骤
-
初始化
从任意一棵生成树 \(T\) 开始(比如用 BFS 树 或 最小生成树)。
计算当前树中所有顶点的度数,记录最大度数 \(\Delta(T)\)。 -
尝试改进
当存在一个“改进机会”时,就执行边交换,降低某个高度数顶点的度数。改进机会定义:
设 \(v\) 是一个度数 \(d_T(v) = k\) 的顶点,我们希望减少 \(v\) 的度数至少 1。
考虑一条不在树中的边 \(e = (u, v)\)(其中 \(u\) 是某个与 \(v\) 在图中相连但不在树中直接相连的顶点)。
将 \(e\) 加入 \(T\),会形成一个唯一的环(树的性质)。
如果这个环上存在一条边 \(e' = (v, w)\) 且 \(w\) 的当前度数 ≤ \(k-2\),那么用 \(e\) 替换 \(e'\) 的效果是:- \(v\) 的度数从 \(k\) 降到 \(k-1\)(因为去掉 \(e'\) 减少 1 度,加上 \(e\) 增加 1 度,但 \(e\) 连接的 \(u\) 原来在树中不与 \(v\) 直接相连,所以净减 1 度?这里要小心,其实是:原来与 \(v\) 相连的 \(w\) 被去掉,换成与 \(u\) 相连,而 \(u\) 原来不连 \(v\),所以 \(v\) 减少一度)。
- \(w\) 的度数从 ≤ \(k-2\) 变成 ≤ \(k-1\),不增加最大度数。
因此,交换后最大度数不增加,并且 \(v\) 的度数减少了 1。
-
循环执行
不断寻找这样的三元组 \((v, e, e')\) 执行交换,直到找不到为止。 -
终止
当无法再找到这样的改进时,算法停止,输出当前树 \(T\)。
4.2 近似保证证明思路(简要)
关键引理:
如果算法停止时,树 \(T\) 的最大度数是 \(k\),那么任何其他生成树(包括最优树)中,必然存在某个顶点的度数 ≥ \(k-1\)。
因此,最优解的最大度数 \(\Delta^* \geq k-1\),即 \(k \leq \Delta^* + 1\)。
如何证明这个引理?
用反证法:假设存在一棵最优树 \(T^*\) 的最大度数 ≤ \(k-2\)。
然后利用当前树 \(T\) 的局部最优性(无法再改进),推导出矛盾。
核心是用树之间的边交换性质与度数条件构造矛盾,需要一些图论推导,此处略去详细证明。
5. 举例说明
假设有无权重完全图 \(K_4\)(4 个顶点,两两相连)。
-
初始树 \(T\) 为一条路径 1-2-3-4,度数分别为 1,2,2,1,最大度数 2。
-
检查是否可以改进最大度数(这里最大度数的顶点 2 和 3 的度数都是 2)。
看顶点 2:它与其他顶点都相连,看非树边 (2,4) 加入树形成环 2-3-4-2,环上有边 (3,4) 或 (2,3) 或 (4,2)。
假设选 (2,4) 加入,要删掉一条与 2 相连的树边,比如 (2,3)。检查 3 的度数:当前是 2,删除 (2,3) 后度数从 2 变成 1(因为 3 还与 4 相连),1 ≤ 2-2=0 吗?不成立,所以这个交换不允许(因为我们要求删掉的边另一端点 w 的度数 ≤ k-2=0,这里 w=3 的度数是 2,不满足条件)。
所以顶点 2 没有可改进的交换。同理检查顶点 3 也没有。于是算法停止,当前树最大度数为 2。
事实上,\(K_4\) 的最小度生成树是星形树(一个中心度数为 3,其余叶节点度数为 1),最大度数是 3。
但这里我们得到了一条路径最大度数 2,比 3 小,实际上 2 ≤ 3,并且 2 ≤ 最优最大度数 + 1 成立。
注意:这个例子中,最优解 Δ* 是多少?
对 \(K_4\),星形树最大度数 3,路径最大度数 2,所以 Δ* = 2,算法已经得到最优。
6. 复杂度与实现细节
- 每次改进减少一个顶点的度数,度数和为 2|V|-2,所以最多 O(|V|^2) 次改进。
- 每次寻找改进可能需要 O(|E|) 时间检查边和环。
- 总复杂度 O(|V|^2 |E|),在稠密图较高,但可通过合适数据结构优化。
7. 小结
- MDST 问题是经典的 NP-hard 组合优化问题。
- 通过局部边交换,可以设计出最大度数 ≤ Δ* + 1 的多项式时间近似算法。
- 这种方法体现了局部搜索在近似算法中的有效应用,并且近似比非常紧(只差 1)。