2010-12-16 10 views
0

BFSを使用してサイクルを見つけるための擬似コードを与えてください。私はこのタイプの他の質問があることを知っていますが、NONEはコードを与えません。広範な最初の検索を使用してグラフ内のサイクルを見つけるための擬似コード

+0

@ppl:あなたは私の質問を表示し、それのように、サイクルが存在するかどうかをテストするために、無向グラフの:) – Programmer

答えて

4

DFSは、タスクにはるかに適しており、さらに有向グラフではより適しています。既に知っていたら、これを無視してください。

擬似コードに関しては、無向グラフでは、これは以前に訪問済みとしてマークされたノードに到達したときに見つかったサイクルを中止し報告する従来のBFSです。あなたはBFS hereの擬似コードを見つけることができます。

有向グラフでは、ノードに到達したときにどの方向に歩いていたのかを覚えておく必要があり、DFSより空間的に複雑な欠点がさらに悪化します。

編集:ああ、私はサイクルのグラフをテストすることについて話していましたが、実際にサイクルを見つけることはありませんでした。 DFSのサイクルを見つけることは簡単なことではありませんが、BFSのサイクルを見つけることは実際のアルゴリズムの複雑さとコードの複雑さの両方ではるかに複雑です。そのため、擬似コードが見つからないのです。

+0

を投票することを忘れないならば、私はウルソリューションが間違っていると思います。次のことを考慮してください:o ---- o – Programmer

+0

あなたはK2を意味しますか?問題が表示されない= S – slezica

+0

無向グラフのサイクルを検出する方法については、2 ---- 1と考えてください。私がBFSを1から始めると、私はそれを訪問先としてマークし、それをキューに追加することから始めます。それから、whileループで、私はそれを待ち行列から取り出し、未訪問の頂点を訪問したものとしてマークし、待ち行列に追加します。つまり、私はキューに2を追加します。今、私はキューから2を取得すると、私は再びすべての隣接する頂点を検討します。そうしているうちに、私は既に訪問された1も考慮する。しかし、これはサイクルを示すものではありません。 – Programmer

-1

おそらくDFSを意味していますが、これはサイクル検出ではるかに一般的です。間違えたと思います。 BFSへの変更はかなり簡単ですが、コアの考え方は変わりません。

func detectCycle() 
    for node in graph: 
    visited = bool[N] 
    set all visited to false 
    detectCycle(n, n, visited) 

func detectCycle(n, origin, visited) 
    for neighbour in graph[n] 
    if neighbour == origin 
     cycle detected 
    if not visited[neighbour] 
     visited[neighbour] = true 
     detectCycle(neighbour, visited) 
     visited[neighbour] = false 
+0

私はBFSについて話していました:) – Programmer

+0

だから、あなたはBFSの疑似コードを持っていますか? – Programmer

+0

@Programmer:check CLRS – phoxis

関連する問題