BFS循环检测

时间:2017-01-30 13:07:57

标签: graph-algorithm pseudocode breadth-first-search cycle-detection

有人可以使用BFS逐步伪代码来搜索有向/无向图中的循环吗?

可以获得O(| V | + | E |)复杂度吗?

到目前为止,我只看到了DFS的实现。

2 个答案:

答案 0 :(得分:1)

您可以采用非递归 DFS算法,其中您通过队列替换节点的堆栈以获取BFS算法。它很简单:

q <- new queue // for DFS you use just a stack
append the start node of n in q
while q is not empty do
    n <- remove first element of q
    if n is visited
        output 'Hurray, I found a cycle'
    mark n as visited
    for each edge (n, m) in E do
        append m to q

由于BFS只访问每个节点和每个边缘一次,因此复杂度为 O (| V | + | E |)。

答案 1 :(得分:0)

我发现BFS算法非常适合。 时间复杂度是一样的。

你想要这样的东西(从维基百科编辑):

Cycle-With-Breadth-First-Search(Graph g, Vertex root):

    create empty set S
    create empty queue Q      

    root.parent = null
    Q.enqueueEdges(root)                      

    while Q is not empty:

        current = Q.dequeue()

        for each node n that is adjacent to current:
            if n is not in S:
                add n to S
                n.parent = current
                Q.enqueue(n)
            else  //We found a cycle
                n.parent = current
                return n and current

我只添加了其中一个循环块用于循环检测,并删除了原始的if目标块以进行目标检测。总的来说它是相同的算法。

要找到确切的周期,您必须找到n和current的共同祖先。最低的一个在O(n)时间内可用。比周期已知。祖先到n和当前。 current和n已连接。

有关周期和BFS的更多信息,请阅读此链接https://stackoverflow.com/a/4464388/6782134