【问题标题】:Cyclic directed and undirected graphs循环有向图和无向图
【发布时间】:2014-04-14 18:17:39
【问题描述】:

如何检测循环中的循环

  1. 有向图
  2. 无向图。

对于无向图.. 我想到的一种算法是使用不相交集。

  • 对于 G 中的每个顶点 v
    • 制作组(v)
  • 对于 G 中的每个边 e(u,v) 一个接一个
    • 如果查找集(u) == 查找集(v)
      • return true // 循环存在
  • 返回假

【问题讨论】:

  • 您的方法称为 union-find,是的,它可用于在无向图中查找循环。或者,只需执行 DFS 并查看您之前是否遇到过节点。对于有向图,使用修改后的 DFS 来跟踪您在当前探索期间查看的内容,并在您从 DFS 回滚时标记未访问的内容。
  • Cycles in an Undirected GraphBest algorithm for detecting cycles in a directed graph 的可能重复项。我在 Stack Overflow 上找不到不相交集循环检测的好链接,但 that works.
  • 您显然试图自己解决(部分)问题,因此可能不值得投反对票,但就个人而言,我认为您在提问之前也应该始终进行 Google 搜索。

标签: algorithm graph directed-acyclic-graphs cyclic-graph


【解决方案1】:

对于无向的,只需use a DFS:如果一条边指向一个已经访问过的顶点,则存在一个循环。

有指导的请看at this question

【讨论】:

    【解决方案2】:

    您在无向图中找到循环的方法应该是这样的:

    • 对于 G 中的每个顶点 v
      • Meke-set(v)
    • 对于 G 中的每个边 e(u,v) 一个接一个
      • 如果查找集(u) == 查找集(v)
        • 返回真
      • 联合集(u, v)
    • 返回假

    对于有向图,您应该使用Tarjan's strongly connected components algorithm 来获取图中强分量的数量。然后,您可以检查强连通分量数是否等于顶点数。因为如果有向图中存在环,那么同一个强连通分量中至少有两个顶点。这意味着如果有向图有环,则强连通分量的总数应小于顶点数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多