1

誰かがBFSを使用してステップバイステップ疑似コードを提供して、有向グラフまたは無向グラフでサイクルを検索できますか?BFSサイクル検出

O(| V | + | E |)の複雑さは得られますか?

これまではDFSの実装しか見ていませんでした。

+1

を読みますか?あなたはする必要がありますか? もしそうでなければ、これを読んで、DFSを好むかもしれません:http://stackoverflow.com/questions/2869647/why-dfs-and-not-bfs-for-finding-cycle-in-graphs – kazu

+0

@kazuしたい実装が不正になっているため、実装方法を確認してください。 –

+0

サイクルが存在するのか、それとも特定のサークルそのものを抽出する必要があるのか​​を知るだけでいいですか? – Codor

答えて

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を|)。

+0

非再帰DFSとは何ですか?擬似コードを提供できますか?実装しようとしましたが機能しませんでした。 –

+0

私は疑似コードとしてアルゴリズムを追加しました。 – clemens

+0

ありがとうございます。キューを使用する必要がありますか?どのように印刷しますか? –

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 

を私は他のサイクル検出のためのそのサイクルブロックを追加し、ターゲット検出のための元に達した場合は、対象ブロックを削除しました。合計で同じアルゴリズムです。

正確なサイクルを見つけるには、nと現在の共通の祖先を見つける必要があります。最も低いものはO(n)時間で利用可能です。サイクルよりも知られています。 nと現在の祖先。電流とnが接続されています。あなたはBFSを使用したいのはなぜサイクルとBFSについての詳細情報については

は、このリンクhttps://stackoverflow.com/a/4464388/6782134

関連する問題