从维基百科的这篇文章中:
http://en.wikipedia.org/wiki/Hamiltonian_path_problem
一个在大多数图上运行快速的哈密顿路径随机算法如下:从随机顶点开始,如果有未访问的邻居,则继续。如果没有更多未访问的邻居,并且形成的路径不是哈密顿路径,则均匀地随机选择一个邻居,并以该邻居为枢轴进行旋转。(也就是说,向那个邻居添加一条边,并从那个邻居中删除一条现有的边,以便不形成循环。)然后,在路径的新末端继续算法。我不太理解这个枢轴过程应该如何工作。有人能详细解释一下这个算法吗?也许我们最终可以更新维基百科文章,以获得更清晰的描述。
编辑1:我现在认为我理解了该算法,但似乎它仅适用于无向图。有人可以证实吗?
以下是我认为它仅适用于无向图的原因: alt text http://www.michaelfogleman.com/static/images/graph.png 假装顶点编号如下:
123
456
789
假设我的路径是:
9, 5, 4, 7, 8
。 8的邻居都已经被访问过了。假设我选择从5中删除一个边缘。如果我删除(9, 5),我最终只会创建一个循环:5, 4, 7, 8, 5
,因此似乎我必须删除(5, 4)并创建(8, 5)。如果图是无向的,那就没问题了,现在我的路径是9、5、8、7、4。但是,如果你想象这些边是有向的,那么这不一定是一条有效的路径,因为(8, 5)是一条边,但(5, 8)可能不是。编辑2:我想对于一个有向图,我可以创建(8, 5)的连接,然后让新路径只是
4, 7, 8, 5
,但这似乎是逆向进行的,因为我必须切掉之前通向顶点5的所有东西。
FindEnd
的功能呢?请参见我的编辑2。 - FogleBird