Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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
Algorithm GCJ-哈密顿圈_Algorithm_Graph_Hamiltonian Cycle - Fatal编程技术网

Algorithm GCJ-哈密顿圈

Algorithm GCJ-哈密顿圈,algorithm,graph,hamiltonian-cycle,Algorithm,Graph,Hamiltonian Cycle,详情如下: 给出了一个完整的无向图,其中有N个节点和K条“禁止”边。N如果你指出缺乏的解释,可能会有所帮助,但我还是会试试 基于O(2k)的解决方案使用。假设存在k禁止边,则存在这些边的2k子集,包括集本身和空集。例如,如果有3条禁止边:{A,B,C},那么将有23=8个子集:{},{A},{B},{C},{A,B},{A,C},{B,C},{A,B,C} 对于每个子集,计算至少包含该子集中所有边的循环数。如果包含边s的循环数为f(s)且s是所有禁止边的集合,则根据包含排除原则,没有任何禁止边的

详情如下:


给出了一个完整的无向图,其中有N个节点和K条“禁止”边。N如果你指出缺乏的解释,可能会有所帮助,但我还是会试试

基于O(2k)的解决方案使用。假设存在k禁止边,则存在这些边的2k子集,包括集本身和空集。例如,如果有3条禁止边:{A,B,C},那么将有23=8个子集:{},{A},{B},{C},{A,B},{A,C},{B,C},{A,B,C}

对于每个子集,计算至少包含该子集中所有边的循环数。如果包含边s的循环数为f(s)s是所有禁止边的集合,则根据包含排除原则,没有任何禁止边的循环数为:

 sum, for each subset s of S: f(s) * (-1)^|s|
其中|s|是s中的元素数。换句话说,任何边的循环数减去至少有1条禁止边的循环数加上至少有2条禁止边的循环数之和

计算f(s)不是一件小事——至少我没有找到一个简单的方法。在继续阅读之前,你可以停下来仔细考虑一下

要计算f(s),请从未涉及任何s节点的节点排列数开始。如果存在m这样的节点,则存在m!排列,你知道的。调用排列数c

现在检查s中链的边。如果存在任何不可能的组合,例如包含3条边的节点或s内的子循环,则f(s)为0


否则,对于每个链增量m乘以1,并将c乘以2m。(有m个位置可将链放入现有排列中,因子2是因为链可以向前或向后。)最后,f(s)c/(2m)。最后一个除法将置换转换为循环。

哇,太棒了!这是一个比我以前看到的更好的解释。事实上通过了我的厚头骨。非常感谢。好的,终于解决了大数据集:)。我试图理解的部分是(-1)^ s |的原因,为什么要减去所有奇数元素,然后再加上偶数元素?我必须阅读更多关于包容排斥原则的内容——显然我没有数学背景,我是一名神经生物学/生物化学家。@xan我知道这句话不知从何而来,但它认为答案应该是
f(s)*(-1)^(| s|+1)
(根据维基百科)…@RontogiannisAristofanis你可能需要进一步阐述。我认为这个总和不同于一般的包含/排除,如果你指的是它的话,因为它是减法的而不是加法的。@xan你是对的,我仔细检查了包含-排除原则的文章。我的建议是正确的,但不适用于当前的问题:)