【问题标题】:What is the dynamic programming algorithm for finding a Hamiltonian cycle in a graph?在图中找到哈密顿圈的动态规划算法是什么?
【发布时间】:2010-11-26 03:23:25
【问题描述】:

什么是在无向图中找到哈密顿圈的动态规划算法? 我在某处看到存在O(n.2^n) 时间复杂度的算法。

【问题讨论】:

    标签: algorithm graph cycle dynamic-programming hamiltonian-cycle


    【解决方案1】:

    我无法挑选出那个特定的算法,但是The Hamiltonian Page 上的哈密顿循环比您可能需要的更多。 :)

    此页面旨在成为 综合论文列表, 源代码、预印本、技术 报告等,可在 关于哈密顿循环的互联网 和哈密顿路径问题 作为一些相关的问题。

    (original URL, currently 404), (Internet Archive)

    【讨论】:

      【解决方案2】:

      确实有一个 O(n2n) 动态规划算法来寻找哈密顿循环。这个想法是一个通用的想法,可以将许多 O(n!) 回溯方法减少到 O(n22n) 或 O(n2n)(以使用更多内存为代价),是考虑作为 具有指定“端点”的集合的子问题

      在这里,既然你想要一个循环,你可以从任何顶点开始。所以修复一个,叫它x。子问题将是:“对于给定的集合SS 中的顶点v,是否有一条路径从x 开始并经过S 的所有顶点,以v 结束? ”打电话给poss[S][v]

      与大多数动态规划问题一样,一旦定义了子问题,剩下的就很明显了:循环遍历所有 2n 组 S 的顶点,以任何“递增”顺序,并且对于每个 v 中的每个这样的S,你可以计算poss[S][v]为:

      poss[S][v] =(在 S 中存在一些 u 使得 poss[S−{v}][u] 为 True 并且存在一条边 u->v

      最后,当存在一个顶点v 使得存在一条边v->xposs[S][v] 为真时,存在一个哈密顿循环,其中S 是所有顶点的集合(x 除外,取决于你如何定义它)。

      如果您想要实际的哈密顿循环而不是仅仅确定是否存在,请让poss[S][v] 存储使之成为可能的实际u,而不仅仅是 True 或 False;这样你就可以在最后追溯一条路径。

      【讨论】:

      • 通过增加顺序,您的意思是只遍历数字 0、1、2,...,或者先遍历大小为 0,然后是 1,然后是 2,然后是 3,...?
      • @staame 我的意思是 any 顺序,如果 A 是 B 的子集,则 A 出现在 B 之前。您确实可以通过按大小迭代集合来做到这一点,但是例如,您也可以按位表示的顺序对它们进行迭代(即,遍历整数 0 到 2^n,并将每个整数解释为一个集合)。
      • 谢谢,这是对图形大小的归纳。如果我理解正确,那么对于任何两个数字 x,y 一定是真的。 x
      • @staame:不完全是。如果 X 是 Y 的子集,那么当您以二进制(以标准方式,作为位图)将 X 和 Y 分别表示为 x 和 y 时,您有 x
      猜你喜欢
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      相关资源
      最近更新 更多