这个问题实际上改述了one。 code jam problem如下:
您将获得一个完整的无向图,其中 N 节点和 K “禁止”边缘。 N < = 300, K < = 15.在图表中找出不使用任何 K 的哈密顿循环数“禁止”边缘。
O(2^N*N^2)
的简单DP方法不适用于 N 。看起来获胜的solutions是O(2^K)
。有人知道如何解决这个问题吗?
答案 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完整问题章节