是否有线性时间算法来查找有向图中不同闭合路径的数量?
伪代码解释就足够了。
答案 0 :(得分:1)
在下文中,“循环”总是指“简单循环” - 即,每个相邻顶点对通过原始图G中的边连接的顶点序列,第一个和最后一个顶点相等,并且序列中的每个其他顶点最多只能处理一次。
经过一番观察后,我发现了一个证明这个问题是NP难的 - 所以不仅没有人知道在线性时间内解决它的方法,没有人知道在多项式中解决它的方法时间。
我发现的证据是在p。 http://www.cs.umd.edu/~jkatz/complexity/f11/lecture23.pdf中的2个,与this answer on Quora链接。
我会解释并稍微扩展一下(我不明白为什么他们在这里写“n ^ n”为“2 ^(n log n)”):
假设我们有一个有向图G,我们想知道G是否包含哈密顿循环。如果我们有一个多项式时间来解决你的问题(计算有向图中简单周期的数量),我们可以在多项式时间内解决这个已知的NP难问题,如下所示:
从G中构建一个新的图G',取G中的每个边(u,v),并将其替换为“小工具”,从而创建从u到v的n ^ n个不同路径。这可以通过以下方式完成: G中的每个边(u,v)在G'中形成n ^ 2个新顶点的n×n网格,将u连接到第一行中的n个顶点中的每一个,这些n个顶点中的每一个都连接到每个顶点。下一行中的n个顶点(对于n ^ 2个第一行到第二行的边),第二行中的每个顶点到第三行中的每个顶点,依此类推,直到第n行和最后一行行。将最后一行中的每个顶点连接到v。我们可以通过这些顶点以完全不同的方式从u到v:在n行中的每一行上,我们可以选择该行中n个顶点中的任何一个从u到v的路径。很明显,这个小工具有多项式大小(n ^ 2个顶点和(n-1)n ^ 2 + 2n个边),我们最多需要n ^ 2个副本(每个边缘一个) G)所以G'也是如此。我们将这个构造的图G'提供给任何用于计算有向图中的有向循环的算法,并使用该答案来确定G是否具有哈密顿循环。
首先,假设G具有哈密顿循环。然后,该哈密顿量的周期具有n个边缘,因此它在G'中对应于(n ^ n)^ n个不同的周期,因此在G'中至少存在这么多个周期。 (可能会有更多,与G中存在的其他周期相对应,但这并不重要。)
OTOH,假设G没有哈密顿循环。然后它可以具有的最长循环具有长度n-1,并且它可以具有的循环的最大数由n ^(n-1)上限。要注意这一点,请注意,任何长度最多为n-1的循环都可以写为n-1个数字的序列,每个数字在1到n的范围内,通过查找循环中编号最小的顶点,将其写下来,以及然后在循环中写下每个连续的顶点,直到再次到达原始顶点,此时我们可以(比方说)继续写下原始顶点的数字,直到我们总共记下n-1个数字。每个循环产生一个n-1个数的独特向量,并且最多有n ^(n-1)个这样的向量,因此在G中最多可以有n ^(n-1)个不同的循环。我们现在可以计算G'中循环次数的上限:由于G中的单个循环最多可以有n-1个边,它最多可以产生(n ^ n)^ (n-1)个循环在G';并且由于G中最多可以有n ^(n-1)个不同的周期,因此G'中最多可以有n ^(n-1)*(n ^ n)^(n-1)个周期。但这简化为n ^(n ^ 2-n)* n ^(n-1)并从那里简化为n ^(n ^ 2-1),这显然严格小于n ^(n ^ 2)。 / p>
因此我们可以判断G是否具有汉密尔顿循环,通过将G'提供给用于计算有向图中的循环的算法并查看答案:如果它至少为n ^(n ^ 2)则G具有哈密顿循环,如果它低于n ^(n ^ 2),那么G没有哈密顿循环。因此,如果存在用于计算有向图中的循环的多项式时间算法,我们还可以在多项式时间内求解哈密顿循环(以及所有其他NP完全问题)。