【问题标题】:Linear algorithm to find number of distinct closed curves in a directed graph?线性算法在有向图中查找不同闭合曲线的数量?
【发布时间】:2016-08-11 15:03:25
【问题描述】:

是否有任何线性时间算法来查找有向图中不同闭合路径的数量?

一个伪代码解释就足够了。

【问题讨论】:

  • @j_random_hacker 我不想列出它们,我只想找到封闭路径的数量......所以也许我猜......
  • 你说的很对,我的阅读理解失败——对不起!我会删除那条评论。

标签: algorithm performance graph directed-graph


【解决方案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-hard 问题,如下所示:

通过获取 G 中的每条边 (u, v) 并将其替换为创建从 u 到 v 的 n^n 条不同路径的“gadget”,从 G 构建一个新图 G'。这可以按如下方式完成:对于G 中的每条边 (u, v),在 G' 中创建一个由 n^2 个新顶点组成的 n×n 网格,将 u 连接到第一行中的每个 n 个顶点,这 n 个顶点中的每一个连接到每个下一行中的 n 个顶点(对于 n^2 总第一行到第二行边),第二行中的每个顶点到第三行中的每个顶点,依此类推,直到第 n 个和最后一个排。将最后一行中的每个顶点连接到 v。我们可以通过这些顶点以 n^n 种不同的方式从 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,并且它可以拥有的最大 number 个循环的上限为 n^(n-1)。要看到这一点,请注意,任何长度最多为 n-1 的循环都可以写成 n-1 个数字的序列,每个数字都在 1 到 n 的范围内,方法是找到循环中编号最小的顶点,将其写下来,然后然后写下循环中的每个连续顶点,直到再次到达原始顶点,此时我们可以(比如说)继续写下原始顶点的编号,直到我们总共写下 n-1 个数字。每个循环都会产生一个由 n-1 个数字组成的不同向量,并且最多有 n^(n-1) 个这样的向量,因此 G 中最多可以有 n^(n-1) 个不同的循环。 G 中的循环数和长度,我们现在可以计算 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)。

因此,我们可以通过将 G' 提供给计算有向图中的循环的算法并查看答案来判断 G 是否具有哈密顿循环:如果它至少为 n^(n^2),则 G 具有哈密顿循环, 而如果它低于 n^(n^2) 则 G 没有哈密顿循环。因此,如果存在一个多项式时间算法来计算有向图中的循环,我们也可以在多项式时间内解决哈密顿循环(以及所有其他 NP 完全问题)。

【讨论】:

    猜你喜欢
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 2019-03-15
    • 1970-01-01
    相关资源
    最近更新 更多