如何找到循环通过特定边缘?

时间:2015-11-27 04:16:30

标签: algorithm graph graph-theory depth-first-search

我知道欧拉循环是一个循环,它只通过每个边缘一次。

但是我想知道是否有任何已知算法可以在图中找到通过特定边的周期?

例如,特别是图表让我说我只想找到经过边A-B的周期然后有周期ABD和AEB

有没有办法找到所有这些特定的边循环而不列出图中的所有循环?

enter image description here

1 个答案:

答案 0 :(得分:-1)

分析:

  1. 如果要列出图形的所有周期,这显然是一个NPC问题,因为输出集不是多项式(想想一个完整的图形)。在这种情况下,您只需在图表上应用深度优先搜索
  2. 如果您想获得计数,此问题可以简化为另一个问题:Detecting all circles in a graph
  3. 问题减少:

    现在我们知道如何判断图G的所有周期数:

    int count_cycles(Graph G) {
        ...
    }
    

    我们想知道通过特定边E的周期数:

    因此,我们可以定义新的图表G',它会打破E的边G并获取结果。

    所以最后的结果是:

    int count_cycles_passing_edge(Graph G, Edge E) {
        Graph G_ = G.exclude(E);
        return count_cycles(G) - count_cycles(G_);
    }
    

    由于

    1. 通过E的周期等于所有周期,不包括未通过的所有周期E
    2. 未通过E的周期等于G'
    3. 中的所有周期

      所以,问题现在缩小为如何在图表中获取所有周期

      所以,你可以看看Detecting all circles in a graph ,并可能有一个有效的方法来解决减少的问题。