我有一个问题。有没有一种有效的方法来获取网格图中两个节点之间的哈密顿路径,留下一些预定义的节点?
例如。 (4 * 3格)
1 0 0 0
0 0 0 0
0 0 2 3
在此网格中找到汉密尔顿路径b / w顶点1和2,但不覆盖3?似乎二分图是一种方式,但根据你的方法必须是最有效的方式。问题本身就是NP完成。
答案 0 :(得分:0)
删除不需要包含的节点并运行强力算法以查找哈密尔顿路径。这将采用O((n-h)!+ n),即NP,其中h是删除的节点数,但这是您可以做的最好的。也是为了找到哈密顿路径,有一种动态方法,但也是指数的(O(2 ^ n * n ^ 2))
答案 1 :(得分:0)
没有必要将这些预定义的节点排除在外:只需考虑它们已访问,您仍然可以将图形作为矩形网格图。如果效率很重要,我建议为网格使用bitset或bitvector表示。
当网格很小,4x3时,蛮力方法是最快的。动态编程使它实际上更慢,除非你有一个更大的图形(6x7 +)。您也可以使用启发式方法来修剪您的搜索树,但同样,图表必须在它帮助之前更大。