先决条件: NP-完备性,哈密顿循环。
哈密顿循环:无向图 G =(V, E) 中的一个循环,它恰好遍历每个顶点一次。
问题陈述:给定一个图 G(V, E),问题是确定该图是否包含一个由属于 V 的所有顶点组成的哈密顿回路。
解释 –
问题的一个实例是为问题指定的输入。独立集问题的一个实例是图 G (V, E),问题是检查该图是否可以在 G 中存在哈密顿环。
由于 NP-Complete 问题,顾名思义,是一个既属于 NP 又属于 NP-hard 的问题,因此问题是 NP-Complete 的证明由两部分组成:
- The problem itself is in NP class.
- All other problems in NP class can be polynomial-time reducible to that.
(B is polynomial-time reducible to C is denoted as )
如果仅满足第二个条件,则该问题称为NP-Hard 。
但是不可能将每个 NP 问题都化简为另一个 NP 问题以始终显示其 NP-Completeness。这就是为什么如果我们想证明一个问题是 NP-Complete,我们只表明这个问题是NP 的,如果任何NP-Complete问题可以简化为那个,那么我们就完成了,即如果 B 是 NP-Complete 并且对于 NP 中的 C,则 C 是 NP-Complete。
- 哈密顿循环在 NP
如果任何问题在 NP 中,那么,给定一个“证书” ,它是问题的解决方案和问题的一个实例(图 G 和正整数 k,在这种情况下),我们将能够验证(检查给出的解决方案是否正确)多项式时间内的证书。
证书是在图中形成哈密顿循环的顶点序列。我们可以通过验证所有顶点都属于该图并且属于该解决方案的每对顶点是相邻的来验证该解决方案。这可以在多项式时间内完成,即O(V + E)使用图 G(V, E) 的以下策略:flag=true For every pair {u, v} in the subset V’: Check that these two have an edge between them If there is no edge, set flag to false and break If flag is true: Solution is correct Else: Solution is incorrect
- 哈密顿循环是 NP 难的
为了证明哈密顿循环是 NP-Hard 问题,我们必须将一个已知的 NP-Hard 问题简化为这个问题。我们将从哈密顿路径问题简化为哈密顿循环问题。
由图 G =(V, E)作为输入组成的哈密顿路径问题的每个实例都可以转换为由图G’ = (V’, E’)组成的哈密顿循环问题。我们将按以下方式构建图 G’:- V’ = 添加原始图 G 的顶点V并添加额外的顶点 V new使得图的所有连接顶点都连接到该顶点。顶点数增加 1, V’ =V+1 。
- E’ = 添加原始图 G 的边 E,并在新添加的顶点和图的原始顶点之间添加新边。边数增加顶点数 V,即E’=E+V 。
通过向新顶点添加新边,可以在多项式时间内获得新图 G’,这需要 O(V) 时间。这种减少可以通过以下两个声明来证明:
- 让我们假设图 G 包含一条哈密顿路径,覆盖图的V个顶点,从一个随机顶点开始,比如说 V开始,到 Vend 结束,现在因为我们将所有顶点连接到 G’ 中的任意新顶点 V new。
我们分别使用边 V end到V new和 V new到 V start将原始哈密顿路径扩展到哈密顿循环。图G’现在包含一次遍历所有顶点的闭环。 - 我们假设图G’有一个哈密顿环穿过所有顶点,包括V new 。现在要将其转换为哈密顿路径,我们删除与循环中的顶点 V new 对应的边。结果路径将覆盖图的顶点 V 并且将只覆盖它们一次。
因此我们可以说图G’包含一个哈密顿环当当当当图G包含一个哈密顿路径。因此,哈密顿循环问题的任何实例都可以简化为哈密顿路径问题的一个实例。因此,哈密顿循环是NP-Hard 。
结论:因为,哈密顿循环既是NP 问题又是NP-Hard 。因此,这是一个NP完全问题。
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。