先决条件 – 顶点覆盖问题,NP 完备性
问题 –给定一个图 G(V, E) 和一个正整数 k,问题是要找出是否存在大小至多为 k 的顶点的子集 V’,使得图中的每条边都连接到某个顶点V’。
解释 –
首先让我们了解问题实例的概念。问题的实例只不过是给定问题的输入。 Vertex Cover 问题的一个实例是图 G(V, E) 和一个正整数 k,问题是检查 G 中是否存在最大 k 大小的顶点覆盖。 由于 NP Complete 问题,根据定义,是一个既是 NP 又是 NP 难的问题,一个问题是 NP Complete 的陈述的证明由两部分组成:
- 证明顶点覆盖在 NP 中 –
如果任何问题在 NP 中,那么,给定问题的“证书”(解决方案)和问题的实例(图 G 和正整数 k,在这种情况下),我们将能够验证(检查无论给出的解决方案是否正确)多项式时间内的证书。顶点覆盖问题的证明是 V 的子集 V’,其中包含顶点覆盖中的顶点。我们可以使用以下策略(对于图 G(V, E))检查集合 V’ 是否是大小为 k 的顶点覆盖:
let count be an integer set count to 0 for each vertex v in V’ remove all edges adjacent to v from set E increment count by 1 if count = k and E is empty then the given solution is correct else the given solution is wrong
很明显,这可以在多项式时间内完成。因此,顶点覆盖问题属于 NP 类。
- 证明顶点覆盖是 NP Hard –
为了证明顶点覆盖是 NP 难的,我们取一些已经被证明是 NP 难的问题,并证明这个问题可以简化为顶点覆盖问题。为此,我们考虑 Clique 问题,它是 NP Complete(因此是 NP Hard)。“In computer science, the clique problem is the computational problem of finding cliques (subsets of vertices, all adjacent to each other, also called complete subgraphs) in a graph.”
在这里,我们考虑找出给定图中是否存在大小为 k 的团的问题。因此,团问题的一个实例是一个图 G(V,E) 和一个非负整数 k,我们需要检查是否存在一个团
G 中的大小 k。现在,我们需要证明 Clique 问题的任何实例 (G, k) 都可以简化为顶点覆盖问题的一个实例。考虑由不在 G 中的所有边组成的图 G’,而是在使用 G 中所有顶点的完整图中。让我们称其为 G 的补集。 现在,确定图中是否存在大小为 k 的团的问题G与寻找是否存在大小|V|的顶点覆盖的问题相同- 王’。我们需要证明情况确实如此。
假设在 G 中有一个大小为 k 的团。令团中的顶点集为 V’。这意味着 |V’| = k。在补图 G’ 中,让我们选择任意边 (u, v)。那么 u 或 v 中的至少一个必须在集合 V – V’ 中。这是因为,如果 u 和 v 都来自集合 V’,则边 (u, v) 将属于 V’,这又意味着边 (u, v) 在 G 中。这是不可能,因为 (u, v) 不在 G 中。因此,G’ 中的所有边都被集合 V – V’ 中的顶点覆盖。
现在假设有一个大小为 |V| 的顶点覆盖 V” – 王’。这意味着 G’ 中的所有边都连接到 V” 中的某个顶点。因此,如果我们从 G’ 中选取任何边 (u, v),它们都不能在集合 V” 之外。这意味着,所有
边 (u, v) 使得 u 和 v 都在集合 V” 之外,在 G 中,即这些边构成了大小为 k 的团。
因此,我们可以说在图 G 中存在一个大小为 k 的团当且仅当存在一个大小为 |V| 的顶点覆盖。 – k in G’,因此,团问题的任何实例都可以简化为顶点覆盖问题的实例。因此,顶点覆盖是 NP Hard。由于顶点覆盖同时属于 NP 和 NP Hard 类,因此它是 NP Complete。
要理解证明,请考虑以下示例图及其补充:
看 – 证明哈密顿路径是 NP 完全的