枚举有向图的所有最小有向循环

时间:2009-11-09 20:27:23

标签: algorithm cycle directed-graph

我有一个有向图,我的问题是枚举所有最小(无法构造为其他周期的并集的周期)此图的有向周期。这与Tarjan算法输出的不同。例如,对于this wikipedia page处的有向图,我想得到c< - > d和d - < - > h作为两个分开的定向循环。

如果这个问题是多项式的,我不会这样做。我跑过一篇论文“枚举最小Dicuts和强连接子图”,似乎得出结论,这个问题是增量多项式(我不知道它意味着什么),但我无法为本文提取算法。我也不确定最小强连通组件是否等同于我定义它的最小周期。

有人知道这个问题的答案吗?

提前致谢!!!

4 个答案:

答案 0 :(得分:2)

如果我们正在寻找最短的路径周期,那似乎很容易。

  • 只需在搜索从节点到自身的最短路径的所有节点上执行breadth first search
  • 如果找不到路径,则可以删除此节点,无需循环
  • 如果你找到一条路径,你已经找到了一个最小的周期(因为我们寻找最短路径,我们可以确保这个周期不能是两个较短周期的并集)。
    • 在一个大的新节点中折叠其中的所有节点,并根据需要调整边缘。
  • 继续,直到没有任何节点。

  • 当你处理完所有节点(顶点)时,你有最小的周期,你可以寻找...但是有一个技巧。

如果仅使用初始集中的节点表示循环,则可以“保持原样”。但是你必须将“大节点”转换为路径(循环之间的公共边缘),并且每个大节点可以被几个这样的路径替换(对于级别1的大节点至少2个,即不包含大节点本身)。找到的循环是这样构造的,你可以选择任何路径并仍然得到一个最小的循环集(没有循环可以得到另外两个的并集),但是有几种可能的这样的集合。您可以添加约束以在选择大节点中的路径时始终采用最短路径,但仍可以存在相同长度的路径。所以这个问题的解决方案显然不够独特。

使用这种天真的方法,复杂度将是O(V.(E + V)),其中V是顶点数,E是边数。 O(E + V)首先来自广度,最坏的情况是你必须执行BFS V次。因此它肯定是更好的多项式。我相信我所描述的是平均情况下的O(log(V)。(E + V)),但我还没有证明它(如果它是真的)。​​

答案 1 :(得分:0)

我们正在寻找所有简单的周期,而不仅仅是最短或最便宜的周期。 (如果简单是正确的术语 - 我指的是不自相交的循环。)

这是一个应该完成工作的广度优先算法:
为节点编号。 在每个节点上放置一个推销员并开始操作: 如果推销员可以选择要采取哪种优势,他会复制自己并采取一切可能的方式。 当他到达一个节点时, 如果它的数量低于他开始时的数量,那么他就死了,如果它是一个人,那么在他记录这个循环并死亡之前他就会被访问过。从列表中删除冗余循环。

我不确定这个的复杂性,但它看起来像O(EV ^ 2)。

修改:
现在我想起来了,你可以通过从编号最小的节点上的一个推销员开始到达O(EV)。当他的所有后代都死了之后,再次与尚未访问过的最低编号节点上的推销员重新开始。重复,直到访问过所有节点。

答案 2 :(得分:0)

也许列举独立周期会有所帮助吗?

我会尝试以下方法。

  1. 首先,为了找到哪些顶点参与循环,请进行传递闭包。这是一个O(V ^ 3)算法。
  2. 删除所有其他顶点。
  3. 现在,剩下的图存在完全独立的周期覆盖(这是我的想法的弱点,我不能证明周期是独立的)
  4. 它的解决方案是 - “双极图中的最大对匹配”算法。
  5. 4.1。将图形(G)中的每个顶点v转换为2(v1和v2),将每个顶点放在两元图(G2)的不同部分。

    4.2。对于G中的每个边e(v,u),从G2的第一部分到第二部分添加边 - e(v1,u2)。

    4.3。找到G2中的最大对匹配。它是G2边缘的一个子集。

    5该子集对应于G中的最大(完整)独立循环集。

答案 3 :(得分:0)

这可能为时已晚,无论如何...... 问题有无多项式解决方案,原因很简单:(di)图中可能存在指数级的最小周期。

考虑n/2个大小为2的集合,并按周期排列它们:A_1, ..., A_{n/2},并使用约定A_{n/2+1}=A_1。当且仅当它们位于连续索引的集合中时,在两个顶点之间放置一条边(因此A_{n/2}中的元素也通过上述约定链接到A_1中的元素)。如果您对有向图而不是简单图感兴趣,请指向边以使其始终指向位于具有较大索引的集合中的顶点,或者在A_{n/2}A_1的情况下,它指向从A_{n/2}中的顶点到A_1中的顶点。

显然,这个长度为2^{n/2}的图表中有n/2个最小周期,因为每个n/2中只包含一个顶点的所有大小为A_i的子集都是这样一个周期。如果要使用算法列出所有算法,则该算法必须至少执行2^{n/2}步骤。