使用BFS检测循环

时间:2017-11-17 17:30:09

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

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

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

2 个答案:

答案 0 :(得分:0)

可以使用广度优先算法方法检测图形中的周期,并通过队列处理值。当您访问顶点V时,如果有任何相邻的顶点U,其中U已经被访问并且不是V的父级,则图形中将存在一个循环。如果不满足前面提到的条件,则图中没有循环。该裁定是基于以下假设:图中没有平行线边缘。

答案 1 :(得分:0)

可以使用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 )

算法完成后,您将获得整个图中最小的周期作为答案。