Algorithm 帕默';哈密顿圈的s算法
在一个“稠密”图中,我正试图用它来构造一个哈密顿圈。然而,我需要对这个算法进行更多的解释,因为当我实现它时,它不适用于我。维基百科的解释似乎有一个不明确的部分 如果有人解释得更清楚或给我一些链接阅读,我将不胜感激 下面是算法声明: Palmer(1997)描述了以下在满足Ore条件的图中构造哈密顿圈的简单算法。 将顶点任意排列成一个循环,忽略图形中的邻接。 当循环包含两个在图中不相邻的连续顶点Algorithm 帕默';哈密顿圈的s算法,algorithm,graph,traveling-salesman,hamiltonian-cycle,Algorithm,Graph,Traveling Salesman,Hamiltonian Cycle,在一个“稠密”图中,我正试图用它来构造一个哈密顿圈。然而,我需要对这个算法进行更多的解释,因为当我实现它时,它不适用于我。维基百科的解释似乎有一个不明确的部分 如果有人解释得更清楚或给我一些链接阅读,我将不胜感激 下面是算法声明: Palmer(1997)描述了以下在满足Ore条件的图中构造哈密顿圈的简单算法。 将顶点任意排列成一个循环,忽略图形中的邻接。 当循环包含两个在图中不相邻的连续顶点vi和vi+1时,执行以下两个步骤: 搜索索引j,使四个顶点vi、vi+1、vj和vj+1都是不同的,
vi
和vi+1
时,执行以下两个步骤:
- 搜索索引
,使四个顶点j
、vi
、vi+1
和vj
都是不同的,并且图形包含从vj+1
到vi
和从vj+1
到vj
的边vi+1
- 反转
和vi+1
之间的循环部分vj
vi, vi + 1, vi + 2, vj - 2, vj - 1, vj, vj + 1
你最终会得到:
vi, vj, vj - 1, vj - 2, vi + 2, vi + 1, vj + 1
因此,在您的示例中,如果选择i=0和j=3,最终结果将是:
0, 3, 2, 1, 4, 0
这里有一个链接(请参阅维基百科的参考部分)。事实上,算法的错误之处在于。帕默自己的描述是
v_i <-> v_j
v_{i+1} <-> v_{j+1}
最初将其排列为1426351
(无相邻邻居)
图中不相邻的第一对循环邻居是(1,4)=(v_1,v_2)
。扫描索引j>2
,使v_j
与v_1
和v_{j+1}
到v_2
,第一次出现的是j=3
。现在在循环中反转零件4…2
(在本例中,4和2之间没有顶点),给出下一个循环
1234561 // index in cycle
1246351 // vertex
1234561 // index in cycle
1236451 // vertex
有两对相邻的邻居((1,2)
和(4,6)
)。第一个索引i
与v_i
不相邻v_{i+1}
为2。扫描第一个j>3
,使v_j
与v_2=2
相邻,且v_{j+1}
与v_3=4
相邻。这就给出了j=5
。现在是v_3
和v_5
之间的部分,给出下一个循环
1234561 // index in cycle
1246351 // vertex
1234561 // index in cycle
1236451 // vertex
再一次,v_3=3
与v_4=6
不相邻,因此i=3
,j=5
,相反
1234561 // index in cycle
1234651 // vertex
现在唯一的错误对是(vu 6,vu 1)=(5,1)
。最小的j>1
,使得v_j
与v_6=5
相邻,并且v_{j+1}
tov_1=1
是j=2
。现在将零件从v_1
反转为v_2
1234561 // index in cycle
2134652 // vertex
这是一个哈密顿循环
➣我会马上解决。如果你把你的尝试放在这里会更好。非常感谢你,丹尼尔,我也注意到维基百科犯了这个错误,但我用了一种与你不同的方式解决了它……可能相似,但不完全相同。不管怎么说,问题解决了…谢谢你们的努力…我检查了你们的解决方案并确保它有效…顺便问一下,你们知道在这种情况下我应该怎么做(当维基百科犯下这样的错误)…我的意思是读者会像我一样痛苦。如果你在维基百科的一篇文章中发现了一个错误,请纠正它(并给出旧文章错误的原因),这是一个维基。不相关的,你应该对我的答案发表评论,而不是发布非答案,这也会通知我。(但是,我看到你的gravatar是不同的,所以就系统而言,这不是你的问题,你不能从该帐户对此发表评论。合并你的帐户不是更好吗?)