哈密顿回路(Hamiltonian Cycle, HC)

哈密顿回路 问题的形式化定义如下:

实例: 无向简单图 G=(V,E)G=(V,E),其中 V={v1,v2,...,vn}V=\{v_1,v_2,...,v_n\}

询问: 图 G 中是否存在一条哈密顿回路。

该问题的证明思路是通过顶点覆盖问题归约证明。

核心思路

直接想太难了,从已知来推未知更容易理解一些。

下图为一个顶点覆盖图,红色的点是顶点覆盖集。

按照下面的步骤先把路径走一遍,先不用管合理性。

步骤是这样的,先走黑色的箭头,然后顺着黄色的箭头转到下一个序号的黑色箭头,遍历完定点覆盖点集的第一个点的所有边,然后顺着蓝色的箭头“瞬移”到第二个点。

按照相同的步骤,顺着黑色-黄色的顺序遍历完全部的和第二个点相连的边,然后顺着蓝色的箭头“瞬移”到第三个点。

同上,顺着黑黄的顺序遍历与第三个点相连的边。

观察上面的过程,可以发现几点。

那下面就可以通过特殊的构造,将想象出的黄线和蓝线“合法化”。

首先,将所有的边换成下面这种图,叫做检测覆盖子图(也叫梯子图):

会发现该类图存在一些特殊的和遍历相关性质。如果要穿过子图所有的点将该图走一遍,且只能从序号为1的点开始从序号为6的点结束的话,那么走一遍的话只有两种走法,即下图 (a),(b);走两遍的话只有一种走法,即下图(c)(分别走两边)。

之后,将于每个点相关联的边对应的检测子图上,按顺序穿起来(相邻的两个子图的起点和终点之间加一条边,最后一个子图的终点和第一个子图的起点之间加一条边),如下图:

随后,再在 K 个顶点之间,加一条边。

这样就完成了上面想象中的那种走法。一一对比,可以发现:

由此,如果存在顶点覆盖,则可以在检测覆盖子图和在其上附加的边中找一条哈密顿回路,反之同理。

直觉告诉我似乎漏了什么情况,但核心意图是这样子的,仅供理解。如果有问题或者确实没问题,欢迎 issue / pr 告知

NPC 证明

暂略