如何证明我的贪婪算法在树上的顶点覆盖的正确性?

时间:2014-10-09 00:51:29

标签: algorithm greedy vertex-cover

树上的顶点覆盖问题如下。

输入:非循环简单无向图G 输出:一组顶点W,对于每个边uv,u∈W或v∈ W.我们希望最小化W的大小。

我的贪心算法是初始化W =∅,然后,当G不为空时,重复以下步骤。令L为G的叶顶点。令N(L)为与L中的某个顶点相邻的顶点集。更新W =W∪N(L)。从G中删除顶点L∪N(L)及其入射边缘。

此算法适用于我迄今为止尝试过的所有情况。我该如何证明它是正确的?这是我到目前为止所拥有的。

假设有另一个集合S是最佳解决方案。矛盾的是,我想要确定S不覆盖所有边缘,或者S与我的贪婪算法产生的S相同。

1 个答案:

答案 0 :(得分:2)

这是一个合理的开始,但我看到两个问题。首先,最佳解决方案可能不是唯一的。考虑四顶点路径a-b-c-d,它有三个最优解:{a,c}, {b,c}, {b,d}。第二个(你可能已经这样做了,但你没有这么说),有必要考虑将树植根。否则,在图表a-b上,我们有L = {a,b}N(L) = {b,a},并且生成的顶点封面是W = {b,a},这不是最佳的。通过将a指定为根,根据定义将其排除在叶子集之外。

为了正式证明涉及循环的程序的正确性,使用归纳法建立循环不变量通常是个好主意。请允许我建议两个。

  1. 对于所有时间t(其中时间=循环迭代次数),令G(t)为时间t处G的左边,并且令W(t)为时间t处的W值。对于G(t)的每个顶点覆盖X,集合W(t)∪X是G(0)的顶点覆盖,其中0是起始时间。

  2. 对于所有时间t,存在包含W(t)作为子集的最优解。

  3. 设T为结束时间。由于G(T)是空图,因此X =∅是G(T)的有效顶点覆盖,因此不变#1确定W(T)是G(0)的顶点覆盖。不变#2确定W(T)包含在某些最优解中。由于W(T)本身是顶点覆盖,W(T)本身必须是最佳解决方案。

    在给出包含W(t-1)但不包含W(t)的最佳解决方案的情况下,证明不变#2的归纳步骤将其按摩成包含W(t)的另一个最佳解决方案。这包括将你的直觉形式化,使得叶子的邻居在叶子上的效率始终至少同样高效。