汉密尔顿路径发现与汉密尔顿循环函数的使用和相反的任务

时间:2013-11-10 14:43:41

标签: algorithm graph graph-theory graph-algorithm hamiltonian-cycle

问题在于测试图G是否包含汉密尔顿路径,使用哈密顿循环Hcycle(V,E)函数,如果G包含哈密顿循环,则输出true为false。

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

另外,我需要编写一个具有相反问题的程序。 (使用Hpath函数来确定图形是否包含Hemiltonian Cycle)。

我无法找到解决此问题的方法。 我只能使用一次Hcycle和Hpath。

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

2 个答案:

答案 0 :(得分:0)

每个哈密尔顿循环都是一条哈密顿路径,只是在某个地方打破循环。

另一种方式并不容易。蛮力解决方案是: 对于所有哈密尔顿路径p,检查p的开始和结束之间是否存在边缘,如果存在,则进行循环。但是如果HPath只返回一些路径,那么就没有办法摆脱它(我猜)。

检查Wikipedia

答案 1 :(得分:0)

路径来自Hcycle(V,E):在通过添加连接到所有其他顶点的一个顶点创建的图上调用Hcycle()。如果新图形具有循环而不是从该循环中移​​除新节点,则我们在原始图形上获得路径。

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

Hcycle路径(V,E):如果图表的周期也比路径还要长。如果图形没有循环而不是每个未连接的顶点对(v1v2),则在它们之间添加边缘并检查是否存在Hcycle(V,E+(v1,v2))的循环。如果有一个循环,则原始图表中的v1v2之间存在路径。 Hcycle被称为最多|V|^2次。

按Hpath(V,E)循环:想法是强制路径有我们知道的终点顶点。这可以通过构造两个顶点具有一度的图来完成。让N(v)成为v的邻居。对于来自(v1,v2)的边n1N(v1)-v2以及来自n2的{​​{1}}来构建图表,方法是删除除N(v2)-v1以外的所有边v1除了n1之外,删除v2的所有边。如果该图表有一个路径,那么它的结尾位于n2v1上,而我们的原始图表有一个圆圈。 Hpath被称为最多v2次。