2012-05-11 6 views
4

STLキューを使用して、グラフ上にBFS(幅優先検索)を実装しています。そのノードが既にキューに存在しない場合は、キュー内のノードをプッシュする必要があります。しかし、STLのキューはnot allow iteration through its elementsなので、STL find関数を使うことはできません。アイテムがSTLキューに既に存在するかどうかを確認します。

各ノードに訪問時にマークするフラグを使用し、フラグがfalseの場合にのみそれらをプッシュすることができますが、BFSを複数回実行する必要があり、毎回、すべてのフラグをリセットする必要がありますので、フラグの代わりにカウンタを使用することになりましたが、キュー内のアイテムを見つける標準的な方法があるかどうかを知りたいと思っています。

+0

グラフにノードの色を保存する別のデータストアが必要です。各ノードにキーとして使用できる一意の識別子がある場合、 'std :: map'を使ってノードの色(白、灰色、黒)を保存することができます。ほとんどの実装で 'std :: map'がRBツリーとして実装されているので、' O(log(n) ')となります。 – Vikas

+0

@Vikas:これは、各ノードにカウンタを割り当てるのと同じだと考えています。 – Ari

+0

BFSは訪問されていない、訪問済みではなく未完了の3つの状態を経ていますが、各ノードにカウンタを割り当てることで意味するものはわかりません。 – Vikas

答えて

6

BFSに「クローズドセット」という概念を実装しているとしますか?これを行う標準的な方法は、既に遭遇した要素の別のstd::setまたはstd::unordered_setを単に維持することです。そうすれば、キューを反復する間にO(n)またはO(1)ルックアップを取得し、サポートされていればO(n)時間かかるでしょう。

+0

ありがとうございます私は各BFSラウンドの始めにセットを空にする必要がありますが、これはうまくいくと思います – Ari

+0

@Ari:ラウンドは何を意味しますか? –

+0

BFSを複数回実行する必要があります。私は各反復**私は**私はBFSアルゴリズムを実行していることを意味します。各ノードのために私は訪問時に増加する変数** c **を持っています。つまり、c Ari

関連する問題