最小顶点覆盖问题(Minimum Vertex Cover)的精确算法(基于分支定界与剪枝)
一、问题描述
最小顶点覆盖(Minimum Vertex Cover, MVC)是指在一个无向图 \(G=(V,E)\) 中,寻找一个顶点集合 \(C \subseteq V\),使得图中每一条边都至少有一个端点属于 \(C\),并且集合 \(C\) 的顶点数尽可能少。这是一个经典的 NP-Hard 问题。虽然存在多项式时间的近似算法(如 2-近似算法),但为了得到精确的最小解,我们常使用分支定界(Branch and Bound)算法,它通过系统性地搜索解空间,并利用剪枝策略避免不必要的计算。
二、算法核心思想
分支定界算法可以看作是对“是否选择某个顶点加入覆盖集”的决策过程构造一棵搜索树。在每一层,我们对一个顶点做出“选”或“不选”的分支决策,并计算当前部分解的下界(lower bound)和上界(upper bound)。如果某个分支的下界已经超过当前已知最优解的大小,就可以剪枝,从而缩小搜索空间。
三、算法详细步骤
步骤 1:预处理与数据表示
- 用邻接表或邻接矩阵存储无向图。
- 定义一个全局变量
best_cover记录当前找到的最小覆盖的顶点数,初值设为 \(|V| + 1\)(表示无穷大)。 - 定义一个栈或递归函数实现深度优先搜索(DFS)构造搜索树。
步骤 2:下界计算(剪枝的关键)
下界表示当前部分解至少还需要多少个顶点才能覆盖所有边。一个有效方法是:
- 从图中移除已经被覆盖的边(即至少一个端点已被选入覆盖集的边)。
- 在剩余图中,计算极大匹配(Maximal Matching,注意不是最大匹配,可以用贪心法快速求得)的大小 \(m\)。
- 因为任意顶点覆盖必须包含匹配中每条边的至少一个端点,所以至少需要 \(m\) 个顶点覆盖这些匹配边。
- 下界 = 当前已选顶点数 + 匹配大小 \(m\)。
步骤 3:上界计算
上界表示当前部分解可能达到的最好结果,用于更新全局最优解。初始时,可以用一个近似算法(如基于最大匹配的 2-近似算法)得到一个覆盖,其大小作为初始上界。在搜索过程中,当找到一个合法覆盖时,用其顶点数更新上界。
步骤 4:分支策略
- 选取一个度数最大的顶点 \(v\) 作为分支顶点,因为它的选择会显著影响剩余图的结构。
- 分支 1:将 \(v\) 加入覆盖集,移除 \(v\) 及其关联的边,递归搜索。
- 分支 2:不将 \(v\) 加入覆盖集,则所有与 \(v\) 相邻的顶点必须加入覆盖集(才能覆盖与 \(v\) 相连的边),移除这些顶点及关联边,递归搜索。
步骤 5:剪枝条件
在搜索树的每个节点:
- 如果下界 ≥ 当前全局最优解大小,剪枝。
- 如果图已无边(即所有边已被覆盖),记录当前覆盖大小并更新最优解,剪枝。
步骤 6:递归框架
function branch_and_bound(graph, selected_vertices, current_size):
if 下界 ≥ best_cover:
return
if 图无边:
best_cover = min(best_cover, current_size)
return
v = 选取度数最大的顶点
# 分支1:选v
new_graph1 = 移除v及其关联边
branch_and_bound(new_graph1, selected_vertices ∪ {v}, current_size + 1)
# 分支2:不选v,则必须选所有邻接点
neighbors = 与v相邻的顶点集合
new_graph2 = 移除neighbors中所有顶点及其关联边
branch_and_bound(new_graph2, selected_vertices ∪ neighbors, current_size + |neighbors|)
四、示例演示
考虑一个简单图:
- 顶点:A, B, C, D
- 边:(A,B), (A,C), (B,C), (B,D), (C,D)
初始上界:用近似算法得一个覆盖,如 {A, B, C},大小为 3,设 best_cover = 3。
搜索过程(简化):
- 初始下界:贪心极大匹配可得匹配 {(A,B), (C,D)},大小 2。下界 = 0 + 2 = 2。
- 选顶点 B(度数最大):
- 分支1:选 B,移除 B 及边 (A,B),(B,C),(B,D)。剩余图 (A,C,D) 有边 (A,C),(C,D)。继续分支。
- 分支2:不选 B,则必须选邻接点 A, C, D。覆盖大小 = 3。更新 best_cover = 3。
- 在分支1中递归:
- 选 C,则覆盖为 {B, C},覆盖所有边。更新 best_cover = 2。
- 最终最优解大小为 2,对应顶点覆盖 {B, C}。
五、时间复杂度与优化
- 最坏时间复杂度是指数级的 \(O(2^n)\),但实际中通过下界剪枝能大幅加速。
- 进一步优化:
- 使用启发式排序选择分支顶点。
- 在计算下界时,采用线性规划松弛(LP relaxation)得到更紧的下界。
- 对图进行归约规则预处理(如移除度为 1 的顶点及其邻居,或移除支配顶点)。
六、总结
基于分支定界的最小顶点覆盖精确算法系统地探索解空间,并利用下界计算和上界更新进行剪枝。虽然问题本质是 NP-Hard,但在中小规模图上,该算法能在可接受时间内找到精确解。实际实现中,结合预处理和启发式策略,可显著提升效率。