我知道这是一个常见的问题。但在许多地方我已经读过使用BFS的循环检测不可能用于有向图。一个例子就是这个链接Why DFS and not BFS for finding cycle in graphs
我认为我们可以使用BFS为有向图实现拓扑排序。如果存在拓扑顺序,那么我们可以说图形是非循环的,否则它是循环的。这不可能吗?
答案 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 )
算法完成后,您将获得整个图中最小的周期作为答案。