不规则网格和哈密顿路径

时间:2011-12-26 20:34:36

标签: c++ c algorithm graph-algorithm

我有一个问题。有没有一种有效的方法来获取网格图中两个节点之间的哈密顿路径,留下一些预定义的节点?

例如。 (4 * 3格)

1 0 0 0
0 0 0 0
0 0 2 3

在此网格中找到汉密尔顿路径b / w顶点1和2,但不覆盖3?似乎二分图是一种方式,但根据你的方法必须是最有效的方式。问题本身就是NP完成。

2 个答案:

答案 0 :(得分:0)

删除不需要包含的节点并运行强力算法以查找哈密尔顿路径。这将采用O((n-h)!+ n),即NP,其中h是删除的节点数,但这是您可以做的最好的。也是为了找到哈密顿路径,有一种动态方法,但也是指数的(O(2 ^ n * n ^ 2))

答案 1 :(得分:0)

没有必要将这些预定义的节点排除在外:只需考虑它们已访问,您仍然可以将图形作为矩形网格图。如果效率很重要,我建议为网格使用bitset或bitvector表示。

当网格很小,4x3时,蛮力方法是最快的。动态编程使它实际上更慢,除非你有一个更大的图形(6x7 +)。您也可以使用启发式方法来修剪您的搜索树,但同样,图表必须在它帮助之前更大。