汉密尔顿路径查找与使用汉密尔顿循环函数相反的任务



问题是使用哈密顿循环Hcycle(V,E)函数来测试图G是否包含哈密顿路径,该函数给出输出真或假,无论G是否包含哈密顿循环。

我必须编写一个具有多项式时间复杂度的程序,该程序必须决定无定向图G是否包含至少一条哈密顿路径,并使用一个哈密顿循环函数来为这个问题提供输出。

我还需要编写一个具有相反问题的程序。(使用 Hpath 函数找出图形是否包含赫密顿循环)。

我找不到这个问题的解决方案。我只能同时使用一次Hcycle和Hpath。

我们假设函数 Hcycle 和 Hpath 以线性时间复杂度运行。

路径 by Hcycle(

V,E):在通过添加一个连接到所有其他顶点的顶点创建的图上调用 Hcycle()。如果新图有一个周期,而不是从该周期中删除新节点,我们将获得原始图上的路径。

按 Hpath(V,E) 循环:在通过添加一个顶点并将其连接到与一个现有顶点相同的邻居创建的图上调用 Hpath()。这意味着这两个顶点将具有相同的天赋。如果新图有路径,则至少有一个路径端点位于这两个顶点上。如果其他顶点不是终点,则它在路径第三位置,通过对路径重新排序,我们可以将两个顶点设置为路径端点。合并这两个顶点(因为它们具有相同的邻居),我们在原始图中得到一个循环。

路径

按 Hcycle(V,E):如果图形有循环,那么它也有路径。如果图没有循环,则对于每对未连接的顶点(v1v2)在它们之间添加边并检查是否存在Hcycle(V,E+(v1,v2))的循环。如果存在循环,则原始图中的v1v2之间有一条路径。Hcycle被称为最大|V|^2次。

循环 Hpath(V,E):想法是强制路径具有我们知道的末端顶点。这可以通过构建两个顶点为一度的图来完成。让N(v)成为v的邻居.对于从N(v1)-v2 (v1,v2)n1的边n2,从N(v2)-v1构造图形,方法是从v1中删除除n1以外的所有边,并从除n2之外v2中删除所有边。如果该图有路径,那么它的末端在v1v2上,并且我们的原始图有一个圆。Hpath被称为最大|E|*|V|^2次。

每个哈密顿循环都是哈密顿路径,只需在某个地方打破循环即可。

反之则不容易。暴力解决方案是:对于所有哈密顿路径 P,检查 P 的起点和终点之间是否有边,如果有,则做一个循环。但是,如果HPath只返回一些路径,则无法从中循环(我猜)。

检查维基百科

最新更新