【问题标题】:Detecting cycles using BFS使用 BFS 检测周期
【发布时间】:2017-11-17 17:30:08
【问题描述】:

我知道这是一个常见问题。但是在许多地方,我读到使用 BFS 进行循环检测对于有向图是不可能的。一个例子是这个链接Why DFS and not BFS for finding cycle in graphs

我认为我们可以使用 BFS 为有向图实现拓扑排序。如果存在拓扑顺序,那么我们可以说图是非循环的,否则它是循环的。不可能吗?

【问题讨论】:

  • 我认为这个问题在cs.stackexchange.com上会得到更好的回答
  • @DerekBrown 我认为这是一个简单的算法问题,可以在这里回答。
  • StackOverflow 往往更多地关注实用问题而不是理论问题。你的问题是“有可能吗?”——这更多地属于 CS 与 StackOverflow 的领域——我们往往需要一些代码(至少是伪代码)。你可以了解更多关于这个区别meta.stackexchange.com/questions/129598/…
  • @Zephyr 是的,我在评论中提到了这一点。回答排除了您问题的前提。是的,拓扑排序工作得很好。

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


【解决方案1】:

可以使用广度优先算法方法检测图中的循环,通过队列处理值。当你访问一个顶点 V 时,如果任何连接到 V 的顶点 U 已经被访问过并且不是 V 的父节点,那么图中存在一个循环。否则,该图没有循环。这种方式是基于图中没有平行边的假设。

【讨论】:

    【解决方案2】:

    可以使用 BFS 检测循环! 您甚至可以检测出图的最短循环。

    节点数等于n。 从每个节点运行一个 bfs。 伪代码:

    1 create a queue Q
    2 create a array visited
    3 create a array level
    4 set answer = infinity
    5 for each node 1 to **n**
    6      mark the visited equals to **0**.  
    7      clear the **Q**
    8      enqueue **v** onto Q
    9      visited [ v ] = 1
    10     while Q is not empty:
    11            t <- Q.dequeue()
    12            for all edges e in G.adjacentEdges(t) do
    13            u <- G.adjacentVertex(t,e)          
    14            if u is not visited:
    15                 visited [ u ] = 1
    16                 level [ u ] = level [ t ] + 1;
    17                 enqueue u onto Q
    18            else:
    19                 answer = min( answer , level [ t ] + level [ u ] + 1 )
    

    完成算法后,您将得到整个图中的最小循环作为答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      相关资源
      最近更新 更多