Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 枚举完整图的哈密顿圈的算法(循环、反转、环绕或重复不计数的排列)_C++_Algorithm_Permutation_Traveling Salesman_Hamiltonian Cycle - Fatal编程技术网

C++ 枚举完整图的哈密顿圈的算法(循环、反转、环绕或重复不计数的排列)

C++ 枚举完整图的哈密顿圈的算法(循环、反转、环绕或重复不计数的排列),c++,algorithm,permutation,traveling-salesman,hamiltonian-cycle,C++,Algorithm,Permutation,Traveling Salesman,Hamiltonian Cycle,我想生成一个完整无向图的所有哈密顿圈(循环和反转计数为重复的集合的置换,并且被忽略) 例如,{1,2,3}的置换是 标准排列: 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 我希望程序/算法为我打印的内容: 1,2,3 因为321只向后123,312只旋转了123个位置,以此类推 我看到很多关于给定集合的圈数的讨论,以及寻找图是否有哈密顿圈的算法,但对于如何在一个完整的无向图中枚举这些圈(即,一组可以在集合中的任何其他数之前或之后的数)却没有任何讨论 我真的很想用一

我想生成一个完整无向图的所有哈密顿圈(循环和反转计数为重复的集合的置换,并且被忽略)

例如,{1,2,3}的置换是

标准排列:

1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1
我希望程序/算法为我打印的内容:

1,2,3
因为321只向后123,312只旋转了123个位置,以此类推

我看到很多关于给定集合的圈数的讨论,以及寻找图是否有哈密顿圈的算法,但对于如何在一个完整的无向图中枚举这些圈(即,一组可以在集合中的任何其他数之前或之后的数)却没有任何讨论


我真的很想用一个算法或C++代码来完成这个任务,或者你能告诉我哪里有关于这个主题的材料。谢谢

您可以对输出设置一些限制,以消除不需要的排列。假设我们想要排列数字1,…,N。为了避免一些特殊情况,假设N>2

为了消除简单的旋转,我们可以要求第一位为1。这是真的,因为任意排列总是可以旋转成这种形式

为了消除反转,我们可以要求第二位的数字必须小于最后一位的数字。这是真的,因为从两个以1开始的排列中,它们是彼此的倒数,正好有一个具有这个性质


因此,一个非常简单的算法可以枚举所有的置换,而忽略无效的置换。当然,也有可能进行优化。例如,在生成步骤中可以很容易地避免不以1开头的排列。

检查路径是否与在循环中不同点开始的路径相同(即,相同循环或相同循环的反向)的一种超级惰性方法是:

1:根据惯例,确定所有循环将从最低顶点数开始,并沿两个相邻序号中较低的一个方向继续

因此,将以相同的方式描述上述所有路径

第二,这里还有其他有用的信息:

如果要检查两条路径是否相同,可以将一条路径与其自身连接起来,并检查它是否包含第二条路径或第二条路径的反向路径

就是

1 2 3 1 2 3 

包含上述所有路径或它们的反向。由于查找所有哈密顿循环的过程似乎比该算法的轻微低效慢得多,我觉得我可以把它加进去:)

谢谢,@Henry,这就是我要找的,但是你知道有没有一个网站有或者你能给我提供更多细节?我有一种感觉,一个人整理列表的程度完全取决于他想解释多少额外的事情(比如上面列出的场景)。这是真的吗?如果是的话,问题是否有一个标准的“可接受的减少水平”?这两个约束条件准确地描述了您在问题中要求的排列。我看不出你如何能在不崩溃本质上不同的哈密顿循环的情况下进一步缩小集合。哦!是的,我误解了。感谢您的澄清;这比我想象的要简单!考虑TSP的动态规划解决方案。考虑子集,而不是Brand Primes置换,需要在1开始。您可以使用位算法有效地实现这一点(需要起点(上的第一位)…)问题与哈密顿循环没有多大关系,这是一个关于置换生成的问题。TAOCP第4卷描述了许多算法。。。