Algorithm 哈密顿圈算法
我在寻找一些哈密顿循环算法,但我找不到任何实现,甚至连一个伪代码都找不到!我甚至不需要输出循环,只需检查图表是否有循环。输入是一个具有V顶点和E边的图。另外,我想有一个算法来检查一个图是否有哈密顿路径。我不需要输出路径,只需检查它是否有路径。这两个问题都应该是多项式时间的。这是一个NP完全问题 蛮力算法只是创建所有置换,并检查其中一个置换是否可行 检查可行性:Algorithm 哈密顿圈算法,algorithm,graph,pseudocode,hamiltonian-cycle,Algorithm,Graph,Pseudocode,Hamiltonian Cycle,我在寻找一些哈密顿循环算法,但我找不到任何实现,甚至连一个伪代码都找不到!我甚至不需要输出循环,只需检查图表是否有循环。输入是一个具有V顶点和E边的图。另外,我想有一个算法来检查一个图是否有哈密顿路径。我不需要输出路径,只需检查它是否有路径。这两个问题都应该是多项式时间的。这是一个NP完全问题 蛮力算法只是创建所有置换,并检查其中一个置换是否可行 检查可行性: 让当前排列为v1,v2,…,vn:如果每个i在图中都有一条边v_i->v_(i+1),并且v_n->v1,那么解决方案是可行的 另一种
让当前排列为
v1,v2,…,vn
:如果每个i
在图中都有一条边v_i->v_(i+1)
,并且v_n->v1
,那么解决方案是可行的
另一种方法是创建一个图形
G'=(V,E',w)
,其中新边E'=VxV
(所有边),权重函数为:
w(u,v) = 1 if there is an edge (u,v) in the original graph
infinity otherwise.
现在你得到了一个,可以用动态规划在
O(n^2*2^n)
中求解它,除非p=NP,否则一般图的哈密顿性不能在多项式时间内确定
在线HCP启发式存在于您可以上传图形并对其进行测试的位置,但如果您想要自己的函数,则需要自己编写,或者拼接到其他人的函数中。Andrew Chalaturnyk写了一个非常好的算法。那么,这意味着它不能在多项式时间内求解?因为有人告诉我这是可能的。我不需要找到循环,只要检查图表是否有循环就行了。你能给我一个关于蛮力方法的算法或伪代码吗?我只需要写一个函数,如果一个图有一个哈密顿圈,它将返回true。我认为存在一个更好的蛮力算法,正如你建议的那样,它将执行常量
n代码>操作,而在某些图中这是一种严重的过度杀伤力(稀疏、邻居数量有限等)。@clu我建议如何使用蛮力进行此操作,只需生成所有排列并检查它们(解释了如何检查它们)。如何生成所有排列包含在SO中的一系列问题中。由于这个问题是NP完全的,这意味着我们不知道是否存在多项式解,一般的假设是它确实无法实现,但它还没有被证明。好吧,但是我如何在C语言中实现它呢?