Algorithm 极稠密无向简单图的Hamilton路数
在一个非常稠密的无向简单图(大约99.99%的边是连通的)中,计算汉密尔顿路径数的最快方法(算法)是什么 我在想以下方法: 首先,计算完整图中Hamilton路径的数目 一次删除一条边,但我无法计算删除一条边会减少多少路径。另外,如何在去除边缘时防止重复计数Algorithm 极稠密无向简单图的Hamilton路数,algorithm,graph,graph-algorithm,Algorithm,Graph,Graph Algorithm,在一个非常稠密的无向简单图(大约99.99%的边是连通的)中,计算汉密尔顿路径数的最快方法(算法)是什么 我在想以下方法: 首先,计算完整图中Hamilton路径的数目 一次删除一条边,但我无法计算删除一条边会减少多少路径。另外,如何在去除边缘时防止重复计数 我在Math.SE上遇到了一个类似的问题,但那是关于Hamilton循环而不是路径的,我希望这能显著改变这个问题。答案也不太清楚,因此这篇文章。我不认为你能计算出汉密尔顿路径的数量 实际生成路径或单独考虑每条路径 数数的时候。对于特殊的图,
我在Math.SE上遇到了一个类似的问题,但那是关于Hamilton循环而不是路径的,我希望这能显著改变这个问题。答案也不太清楚,因此这篇文章。我不认为你能计算出汉密尔顿路径的数量 实际生成路径或单独考虑每条路径 数数的时候。对于特殊的图,比如完整的图 这当然是可能的,但不是一般的 您可以在完整的图中生成所有Hamilton路径并进行检查 如果它使用图形中的边子集,则为每个边。当然 您可以通过在运行时修剪某些分支来加快速度 生成完整图中的Hamilton路径 因为您的图非常大,所以这种方法肯定不适用 可行。但是,您可以计算中所有路径的数目 包含缺失边之一的完整图形,然后减去 这个号码 我不认为这是微不足道的。关于它的一些思考:让我们考虑一下 缺少一条边的最简单情况。我们可以描述一条路径 具有一系列边或节点。假设你的图有n 节点。图中有
n-1
缺失边的可能位置
通过完整图的hamilton路径。该边可以在中穿过
可以沿两个方向遍历与边不相邻的节点
在(n-2)代码>不同的订单。因此我们可以减法
2 * (n-1) * (n-2)! = 2 * (n-1)!
从通过完整图的hamilton路径总数到
获得期望的结果
如果正好缺了两条边,我们不能只减去两倍的边
数字,因为我们两次计算多条路径,即路径
包含两条边的。所以我们必须计算这个数字,然后把它加起来
再一次。但现在它变得复杂了:重要的是如何处理边缘
它们是相关的。如果它们是相邻的,则该数字将小于它的值
否则。所以一般来说,你不能只计算
包含k
条缺失边的hamilton路径,但它是
重要信息:您正在考虑哪些边以及它们是否
相邻与否
但是假设你可以计算通过某个特定路径的路径数
选择边(所有排列、遍历方向和
路径中的位置)。让我们进一步假设k
边是
丢失的您可以计算至少包含一条路径的路径数
对于这样的边:
分别计算通过任何k
边的路径数
总结一下
对于每对边,您已经计算了穿过该对边的路径
两次,所以再次减去这些路径(考虑每一对
个别地)
现在考虑包含三条边的路径。他们已经
数到六次,减去三次(三对不同),所以
你必须减去它们两次
包含四条边的路径必须减去3次(因为
它们在包含3条边的路径中表示4次)。诸如此类
开
但又一次:你必须考虑每个边缘的组合。
个别地。甚至有可能某一组边是
不兼容,因为某个节点出现三次。也考虑
说明边的横穿方向
因此,没有简单的公式,但如果缺少边的数量是
非常小,你可以数路径。如果我没有错,就有n条!完整图的路径。这难道不是一个O(n!)算法吗?我怎样才能加快速度,请说得更具体些。还有,你这里所说的“特殊图表”到底是什么意思?对于特殊图表,我指的是完整的图表(也更新了答案)。是的,复杂性是O(n!)。这只适用于较小的图形。我会考虑的。也许我能找到一个更好的解决方案。你的图会有多大,有多少边会被删除?1-2或100-200?最多可以有10^5个节点,边缘是否可能是相邻的?我想如果没有的话会容易些。你是说去掉了边吗?如果是,删除的边可以是相邻的。是的,对不起,我指的是删除的边。好的,我会考虑的。我想我必须更新我的答案,因为肯定有一种方法可以更快地做到这一点,但我还不能简明扼要地写下来。