Algorithm 图中的圈检测

Algorithm 图中的圈检测,algorithm,graph,graph-theory,Algorithm,Graph,Graph Theory,可能重复: 谁能给我一个教程,算法,。。。用于检测图中的循环 我找到了几种算法并实现了它们,但没有检测到所有的周期 我认为DFS将完成您的工作,因为我们标记了已访问的节点,如果我们再次找到该节点,则会有一个循环BFS alg。也可以。我认为它比DFS更容易实现,因为它将已访问/待访问节点保持在队列中。更容易检查某个节点是否已被访问。从更数学的角度来看: 输入:图G=(V,E) 假设图形不是不相交的(每两个顶点之间存在一条路径) 计算图的T(有简单的算法可以做到这一点) 设E'是E的一个子集,不

可能重复:

谁能给我一个教程,算法,。。。用于检测图中的循环

我找到了几种算法并实现了它们,但没有检测到所有的周期


我认为DFS将完成您的工作,因为我们标记了已访问的节点,如果我们再次找到该节点,则会有一个循环BFS alg。也可以。我认为它比DFS更容易实现,因为它将已访问/待访问节点保持在队列中。更容易检查某个节点是否已被访问。

从更数学的角度来看:

输入:图G=(V,E)

  • 假设图形不是不相交的(每两个顶点之间存在一条路径)

  • 计算图的T(有简单的算法可以做到这一点)

  • 设E'是E的一个子集,不属于生成树t。对于E'中的每一条边E',它添加到树中正好创建一个循环。让我们把所有这些循环放到B组

  • 我们在图中定义了一个过循环。在该空间中,可以添加两个循环。加法只是边上的一个互斥和

  • 循环B的集合是“循环基础”。图中的每一个周期都可以形成周期B的线性组合

  • 通过这种方式,您可以获得图形中所有可能的循环


    警告:如果您的输入图有v个顶点和e个边,则有2^(e-v+1)-1个不同的循环!这太多了-您可能不想显式地写出所有的问题。

    我认为问题在这里,尽管被标记为“已回答”,但回答不正确。@Cygn这不是允许DUP的理由。只需转到那里,通过发布一条评论来“加热”这个问题,说明有一个实现可以检测python库中名为
    networkx
    的图形中的所有周期。它使用起来真的很简单!我在下面的帖子中给出了一个详细的答案:这种方法是不正确的。以这个例子
    1->22->31->3
    现在,我们做dfs(1)。这将调用dfs(2)并将2标记为已访问。这将调用dfs(3)并将3标记为已访问。现在将再次从节点1调用dfs(3),并且由于已经访问了它,您将错误地推断它是一个循环