【发布时间】:2011-06-17 20:19:32
【问题描述】:
我最近试图提出哈密顿路径的总数(基本上从起始顶点开始,准确地访问每个节点一次并到达结束顶点)。蛮力 dfs 在 7x8 的中等大小的网格上走了很长一段路。我想出了一些修剪策略。这些修剪技术的目标是不应该进一步扩展不能是哈密顿路径的部分路径。
DFS 算法: 开始为起始顶点,访问其邻居节点并递归。记录访问过的节点数,一旦到达结束顶点,检查访问过的节点总数是否与网格中的总节点数相同。这将是指数复杂度,因为对于每个顶点,您可以在 4 个方向上进行,这将是 O(4^n)。所以重点应该是尽快拒绝一条路径,而不是等到到达终点。
修剪技巧:
1) 对于给定的部分路径,检查剩余的图是否连通。如果不是,那么这条部分路径就不能成为哈密顿路径。
2) 对于给定的部分路径,每个尚未访问的节点必须具有至少 2 度,以便可以使用一个邻居节点进入该节点,并使用其他其他邻居退出。
我想知道这些修剪技术可以节省多少时间。我是否也错过了一些非常重要的修剪技术,因为我的速度并不显着。
提前致谢!!!
【问题讨论】:
-
This question 上的数学溢出几乎相同,并且没有太多帮助。显然这个问题(或类似的问题)是 NP-Hard,所以不太可能有比你那里更快的算法。
-
是的,这个问题是 NP-Hard,我在 MO 上看到过该帖子,但我期待更多活动可以解决这个问题,因为它有很多实际应用。 NP中的问题不一定会导致无法解决。
标签: algorithm grid hamiltonian-cycle