如何找到不使用“禁止”边缘的哈密顿循环数?

时间:2011-01-21 14:30:49

标签: algorithm graph hamiltonian-cycle

这个问题实际上改述了onecode jam problem如下:

您将获得一个完整的无向图,其中 N 节点和 K “禁止”边缘。 N < = 300, K < = 15.在图表中找出不使用任​​何 K 的哈密顿循环数“禁止”边缘。

O(2^N*N^2)的简单DP方法不适用于 N 。看起来获胜的solutionsO(2^K)。有人知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

让我们找出禁止边的每个子集S,存在多少哈密顿周期,使用S的所有边。如果我们解决这个子任务,那么我们将通过inclusion-exclusion formula解决问题。

现在我们如何解决子任务?让我们绘制S的所有边。如果存在度数大于2的顶点,那么显然我们无法完成循环并且答案为0.否则图形被划分为连通分量。每个组件都是唯一的顶点,循环或简单的路径。

如果存在循环,则它必须通过所有顶点,否则我们将无法完成哈密顿循环。如果是这种情况,答案是2.(循环可以在2个方向上移动。)否则答案为0。

剩下的情况是 c 路径和 k 唯一的顶点。要完成哈密顿循环,我们必须选择每条路径的方向( 2 ^ c 方式),然后选择组件的顺序。我们有 c + k 组件,因此可以用(c + k)!方式重新排列。但我们对周期感兴趣,所以我们不区分通过循环移位变成彼此的顺序。 (所以(1,2,3),(2,3,1)和(3,1,2)是相同的。)这意味着我们必须将答案除以移位数, c + k 即可。所以答案(对于子任务)是 2 ^ c(c + k-1)!

这个想法是在bmerry的解决方案中实现的(非常干净的代码,btw)。

答案 1 :(得分:1)

哈密顿循环问题是旅行商问题的一个特例(通过将两个城市之间的距离设置为有限常数,如果它们相邻且无穷大而获得。)

这些是NP完全问题,用简单的话来表示没有快速解决它们的问题。

用于定位哈密顿路径的简单启发式算法是构造路径abc ...并将其扩展直到不再可能;当路径abc ... xyz不能再延长因为z的所有邻居已经位于路径中时,一个人返回一步,移除边缘yz并用y的另一个邻居扩展路径;如果没有选择产生哈密尔顿路径,则进一步退回,移除边缘xy并使用x的不同邻居扩展路径,依此类推。该算法肯定会找到哈密顿路径(如果有的话),但它会以指数时间运行。

有关更多检查NP Cormen的“Algos简介”中的NP完整问题章节