Algorithm 如何找到图中的哈密顿路径数?

Algorithm 如何找到图中的哈密顿路径数?,algorithm,graph,hamiltonian-cycle,Algorithm,Graph,Hamiltonian Cycle,我正在尝试这个Google Codejam问题,它说如果我们从一个完整的图中去掉k条边,就可以找出哈密顿路径的数目 链接到问题 我想我们可以用包含排除原理来找出数字 但是我的问题是,当我们考虑到一些“x”个边已经从完整的图中移除时,如何确定路径的数量(移除的边是给定的)这个想法是计算置换,而不是计算路径。这样,每条路径将被考虑2*n次 如果排列为n!则为总数 让我们使用内含排除原理来计算坏周期。如果一条边被禁止,则有2*n*(n-2)!包含此边的路径(我们将两个相邻的顶点放在一起,其余的任意位

我正在尝试这个Google Codejam问题,它说如果我们从一个完整的图中去掉k条边,就可以找出哈密顿路径的数目

链接到问题

我想我们可以用包含排除原理来找出数字


但是我的问题是,当我们考虑到一些“x”个边已经从完整的图中移除时,如何确定路径的数量(移除的边是给定的)

这个想法是计算置换,而不是计算路径。这样,每条路径将被考虑2*n次

如果排列为n!则为总数

让我们使用内含排除原理来计算坏周期。如果一条边被禁止,则有2*n*(n-2)!包含此边的路径(我们将两个相邻的顶点放在一起,其余的任意位置)


如果存在多条禁止的边,则所有Vetrice将被划分为多个独立的组(它们形成由这些边连接的链)。放置每个组有两种方法(因为可以反转)。所有组都可以任意相互排列。其余的元素可以放在任何地方(它将作为二项式系数乘以某个阶乘)。还有一个警告:链条可以缠绕。但这样的链条最多只能有一条。因此,我们可以使用上述算法在包装链上迭代,并计算放置其余部分的方法的数量。

其思想是计算置换,而不是计算路径。这样,每条路径将被考虑2*n次

如果排列为n!则为总数

让我们使用内含排除原理来计算坏周期。如果一条边被禁止,则有2*n*(n-2)!包含此边的路径(我们将两个相邻的顶点放在一起,其余的任意位置)


如果存在多条禁止的边,则所有Vetrice将被划分为多个独立的组(它们形成由这些边连接的链)。放置每个组有两种方法(因为可以反转)。所有组都可以任意相互排列。其余的元素可以放在任何地方(它将作为二项式系数乘以某个阶乘)。还有一个警告:链条可以缠绕。但这样的链条最多只能有一条。因此,我们可以使用上述算法在包裹链上迭代,并计算放置其余边的方法的数量。

如果一条边被禁止,那么我们将考虑将两个顶点连接为一个顶点?你能解释一下什么是环链吗?@Ezio是的,两个相连的向量被视为一个顶点。环绕意味着,假设一条边(1,2)被禁止,1是排列的第一个元素,2是最后一个元素。因此,假设有两条边从n个顶点的完整图中移除,那么我们如何从数学上表示包含排除公式呢?@Ezio我们需要计算正好有一条坏边的排列数,然后从中减去有两条坏边的排列数。实际上,我的问题是如何计算有x条坏边的排列数我可以应用包含排除原理,但是当我们考虑如果一个边被禁止时,如果我们说x坏的边,那么我们考虑两个顶点连接成一个单一的顶点,那么我怎么计算排列的数目有问题呢?你能解释一下什么是环链吗?@Ezio是的,两个相连的向量被视为一个顶点。环绕意味着,假设一条边(1,2)被禁止,1是排列的第一个元素,2是最后一个元素。因此,假设有两条边从n个顶点的完整图中移除,那么我们如何从数学上表示包含排除公式呢?@Ezio我们需要计算正好有一条坏边的排列数,然后从中减去有两条坏边的排列数。实际上,我的问题是如何计算有x条坏边的排列数我可以应用包含排除原理,但是当我们考虑X坏边时,如何计算排列数是个问题。