分层技术求解顶点覆盖问题
图上的顶点覆盖问题是一类特殊的集合覆盖问题,如果你把每一个顶点变换成其邻边的集合,那么顶点的集合就会被替换成一个邻边集合的集合,记为S。可以看到,我们把图中的边集记为全集U,那么从S中选择集合来覆盖U就是一个集合覆盖问题。本文我们介绍一种叫做分层的技术来求解顶点覆盖问题。
一个特殊顶点权重的例子
在一个图中,如果每个顶点的权重被定义为它的度,那么这个图会变得非常特殊(如下图)。
在这个图中,最小覆盖集(之一)如下:
我们想阐述一个事实:
在图G=(V,E)中,记最小覆盖集的权重和为OPT,那么即使我们选完图上的所有顶点作为覆盖集C(C=V),那么也有:
c
o
s
t
(
C
)
≤
2
⋅
O
P
T
cost(C)\leq 2·OPT
cost(C)≤2⋅OPT
显然在上例中OPT=12,而cost(V)=24,是满足这个不等式的。
证明:
首先有:OPT>=|E| ,因为覆盖集是必须要覆盖到每一条边的,就算每一条边只和覆盖集中一个顶点相连,OPT也得等于|E|,何况可能会有一些边和覆盖集中的两个顶点相连呢。
其次有:cost(V)=2*|E|,其实cost(V)就是顶点度的和,由度和公式知该等式成立。
因此有:cost(V)=2*|E|<=2·OPT
一般化结论:
如果所有顶点的权重都是度的某一常数c倍(满足这个性质,我们就称该图顶点的权重叫做基于度的权重),也有cost(V)<=2·OPT。(其实就是不等式两边同时乘以了c,方法和上面雷同,就不证明了)。
一般权重的情况
一般权重下,我们可以借鉴上述性质构造一个算法,从图中一层一层地剥离出顶点基于度的权重的子图来。算法步骤如下:
- 去除图中的孤立点将他们添加到集合d_i(i表示循环轮数,因此这个集合表示i轮循环中出现的孤立点),如果图为空,结束循环
- 遍历剩余图中的所有顶点v,计算c=cost(v)/deg(v),找到最小的c_min,从图中剥离出基于c_min倍顶点权重的子图,对于c=c_min的顶点,将其添加到集合w_i(i表示循环的轮数,因此该集合表示i轮循环中平均代价最小的点)
- 循环上述步骤
- 输出顶点覆盖集为所有w_i的并集W。
用一幅图来概括大概就是这样:
一个具体实例如下:
一开始的图G0:
清除孤立点:
计算出c_min=1/4,从图中剥离出基于c_min倍度数权重的子图:
没有孤立点可以去除,继续计算出c_min=1/8,从图中剥离出基于c_min倍度数权重的子图:
现在只剩下孤立点,去除后程序运行完毕,下面是最终生成的覆盖集合(红色点,我们还标记出了每个点的分类):
下面我们来分析算法,讨论为什么W是一个覆盖集,以及为什么cost(W)<=2·OPT
首先为什么W是覆盖集?我们说明这样一个事实,所有的边只有两种情况:
- 一个顶点在W中,一个顶点在D中
- 两个顶点都在W中
这两个条件就表明了W是覆盖集,也就等价于不存在这样的情况:
- 两个顶点都在D中
我们来证明这个命题。从上图也能看出来他是成立的,原因何在呢?很简单,如果两个顶点i,j相互连接,他们二者之一必有一个是被集合W选走的,否则它两不可能被D选走。因为W不选走他们之一,它两就不会落单,不会落单就不会被D选走。
所以,W是覆盖集就得证了,下面我们考虑为什么这个近似算法的cost<=2·OPT:
基于分层,这个问题就很容易得证了,我们可以把cost看成覆盖集W在每个分层图中的cost的累加:
OPT也能如此分解在每个分层图中,并且OPT对应的覆盖集在每个分层图中的分解也是分层图的覆盖集,这是很显然的。当然在分层图中OPT可能还会有位于D上的顶点,这更不妨碍在W第i层分解上的开销不大于2倍OPT在第i层分解上的开销。对每一层求和,即可得到cost(W)<=2·OPT