【问题标题】:Hamiltonian Cycle algorithm哈密​​顿循环算法
【发布时间】:2013-11-10 18:20:06
【问题描述】:

我一直在寻找一些哈密顿循环算法,但我找不到任何实现,甚至没有一个伪代码!我什至不需要输出循环,只需检查图形是否有循环。输入是一个具有 V 个顶点和 E 个边的图。另外,我想有一个算法来检查一个图是否有哈密顿路径。我不需要输出路径,只需检查它是否有一个。两者都应该在多项式时间内。

【问题讨论】:

    标签: algorithm graph pseudocode hamiltonian-cycle


    【解决方案1】:

    该问题是 NP-Complete 问题之一。

    蛮力算法只是创建所有排列并检查其中一个是否是可行的解决方案。

    检查可行性:
    让当前排列为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.
    

    现在你得到了一个Traveling-salesman problem,并且可以在O(n^2*2^n) 中使用动态规划来解决它

    【讨论】:

    • 那么,这意味着它不能在多项式时间内解决?因为有人告诉我可以。我不必找到循环,只需检查图表是否有它。你能给我那个蛮力方法的算法或伪代码吗?我只需要编写一个函数,如果图形具有哈密顿循环,则返回 true。
    • 我认为您存在更好的蛮力算法,因为在您的建议中它将执行恒定的n! 操作,而在某些图中,这是一个严重的过度杀伤(稀疏,有限数量的邻居,等等...)。
    • @clu 我建议如何在蛮力中做到这一点,只需生成所有排列并检查它们(解释了如何检查它们)。 SO中的一堆问题涵盖了如何生成所有排列。 PS - 由于问题是 NP-Complete,这意味着我们不知道是否存在多项式解决方案,一般假设它确实无法完成,但尚未证明。
    • 好吧,但是我该如何在 C 中实现呢?
    【解决方案2】:

    除非 P = NP,否则不能在多项式时间内确定一般图的哈密顿性。

    在线 HCP 启发式存在于 http://fhcp.edu.au/slhweb/,您可以在其中上传图表并对其进行测试,但如果您想要自己的函数,您需要自己编写,或者拼接到其他人的函数中。 Andrew Chalaturnyk 写了一个非常好的算法。

    【讨论】:

      猜你喜欢
      • 2012-07-01
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      相关资源
      最近更新 更多