📜  证明顶点覆盖是 NP 完备的(1)

📅  最后修改于: 2023-12-03 14:57:40.760000             🧑  作者: Mango

证明顶点覆盖是 NP 完备的

什么是顶点覆盖?

在图论中,顶点覆盖是指,选择图中一些点,使得每条边至少有一个端点被选择。例如下图中,红色点构成的集合 {1, 3, 4} 就是一个顶点覆盖。

Vertex Cover

为什么顶点覆盖是 NP 完备的?

首先,我们需要知道什么是 NP 问题和 NP 完备问题。

  • NP 问题是指,可以在多项式时间内验证一个解是否正确的问题,但是求解一个最优解可能需要指数时间。
  • NP 完备问题是指,既是 NP 问题,又可以用 NP 问题之间的归约来证明是 NP 完备。

要证明顶点覆盖是 NP 完备的,我们需要分两步:

  1. 证明顶点覆盖是 NP 问题;
  2. 找到一个 NP 完备问题,并证明它可以规约到顶点覆盖。
确定顶点覆盖是 NP 问题

首先,我们需要证明一个问题是 NP 问题,只需要证明其解的验证可以在多项式时间内完成。

对于顶点覆盖问题,假设我们已经选择了一些点,我们需要验证这些点是否构成一个顶点覆盖。这可以通过检查每一条边,看它的两个端点是否都被选择了来实现。由于每条边只需要检查一次,因此,该验证过程可以在多项式时间内完成。所以,顶点覆盖问题是 NP 问题。

将一个 NP 完备问题规约到顶点覆盖

为了证明顶点覆盖是 NP 完备的,我们需要找到一个已知的 NP 完备问题,并证明它可以规约到顶点覆盖。

一个常见的 NP 完备问题是 3-SAT(三元布尔可满足性问题)。该问题是指:给定一个由布尔变量和逻辑运算符组成的公式,问是否存在一种赋值,使得该公式的结果为真。该问题已经被证明是 NP 完备的。

我们可以将 3-SAT 问题规约到顶点覆盖问题。具体来说,对于 3-SAT 问题中的每个子句,我们创建一个长度为 3 的路径,并将路径的中间点分别与子句中的三个变量相关联。为了保证任何时候都可以选择路径上的一个端点来覆盖路径,我们需要在每个路径的两个端点之间添加一条边。最终,我们在构建完所有路径之后,从图中选择一个大小为 k 的顶点覆盖,使得每个长度为 3 的路径至少有一个端点被覆盖。

我们通过上述规约,将 3-SAT 问题转换为顶点覆盖问题。由于 3-SAT 问题已经被证明是 NP 完备的,因此,顶点覆盖问题也是 NP 完备的。

总结

通过以上证明,我们可以得出结论:顶点覆盖是 NP 完备的。这意味着,我们需要使用 NP 完备问题的解法来处理顶点覆盖问题。通常,我们可以使用近似算法(近似算法保证最终的解与最优解之间的差距不会太大)或者枚举算法来解决 NP 完备问题。