【发布时间】:2010-11-26 03:23:25
【问题描述】:
什么是在无向图中找到哈密顿圈的动态规划算法?
我在某处看到存在O(n.2^n) 时间复杂度的算法。
【问题讨论】:
标签: algorithm graph cycle dynamic-programming hamiltonian-cycle
什么是在无向图中找到哈密顿圈的动态规划算法?
我在某处看到存在O(n.2^n) 时间复杂度的算法。
【问题讨论】:
标签: algorithm graph cycle dynamic-programming hamiltonian-cycle
我无法挑选出那个特定的算法,但是The Hamiltonian Page 上的哈密顿循环比您可能需要的更多。 :)
此页面旨在成为 综合论文列表, 源代码、预印本、技术 报告等,可在 关于哈密顿循环的互联网 和哈密顿路径问题 作为一些相关的问题。
【讨论】:
确实有一个 O(n2n) 动态规划算法来寻找哈密顿循环。这个想法是一个通用的想法,可以将许多 O(n!) 回溯方法减少到 O(n22n) 或 O(n2n)(以使用更多内存为代价),是考虑作为 具有指定“端点”的集合的子问题。
在这里,既然你想要一个循环,你可以从任何顶点开始。所以修复一个,叫它x。子问题将是:“对于给定的集合S 和S 中的顶点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->x 且poss[S][v] 为真时,存在一个哈密顿循环,其中S 是所有顶点的集合(x 除外,取决于你如何定义它)。
如果您想要实际的哈密顿循环而不是仅仅确定是否存在,请让poss[S][v] 存储使之成为可能的实际u,而不仅仅是 True 或 False;这样你就可以在最后追溯一条路径。
【讨论】: