の DFS の場合、探索中のノードはスタック データ構造に格納されます。未探索のノードにつながるエッジは「」と呼ばれます ディスカバリー エッジ ‘ すでに訪問したノードにつながるエッジは呼び出されます ‘ ブロック エッジ '。 DFS プログラマーがグラフ内の接続されたコンポーネントまたはサイクルを見つけたい場合のシナリオで役立ちます。
この記事のガイドラインに従って実装してください DFS C++で。
C++ での DFS の実装
次のセクションでは、その方法について説明します DFS C++ で実装されています。与えられた手順に従って実装することができます DFS .
- ツリーまたはグラフのルート ノードをスタックに挿入します。
- スタックの一番上の項目を訪問済みリストに追加します。
- 訪問したノードに隣接するすべてのノードを検出し、まだ訪問していないノードをスタックに追加します。
- スタックが空になるまで、手順 2 と 3 を繰り返します。
DFS 疑似コード
の DFS 擬似コードを以下に示します。の中に 熱() 関数を実行します DFS 各ノードで機能します。グラフには 2 つの切断された部分がある可能性があるため、 DFS 各ノードでアルゴリズムを実行して、すべての頂点を確実にカバーできるようにします。
DFS ( ガ )
a. 訪れた = 真実
ために すべての b ∈ g。 調整 [ a ]
もしも b. 訪れた == 間違い
DFS ( g、b )
熱 ( )
{
すべての a ∈ g に対して
a. 訪れた = 間違い
すべての a ∈ g に対して
DFS ( g、a )
}
ここで、g、a、b はそれぞれグラフ、最初に訪れたノード、スタック内のノードを表します。
C++ での DFS の実装
のための C++ プログラム DFS 実装を以下に示します。
#include
#include<マップ>
#include<リスト>
使用して 名前空間 標準 ;
レンプレート < タイプ名 t >
クラス 深さ優先検索
{
プライベート :
地図 < t,リスト < t > > adjList ;
公共 :
深さ優先検索 ( ) { }
空所 Add_edge ( ta、tb、 ブール あなた = 真実 )
{
adjList [ a ] . push_back ( b ) ;
もしも ( あなた )
{
adjList [ b ] . push_back ( a ) ;
}
}
空所 印刷する ( )
{
ために ( 自動 私 : adjList ) {
カウト << 私。 初め << '->' ;
ために ( エントリー : 私。 2番 ) {
カウト << エントリ << '、' ;
}
カウト << エンドル ;
}
}
空所 dfs_helper ( t ノード、マップ < t、 ブール > & 訪れた ) {
訪れた [ ノード ] = 真実 ;
カウト << ノード << ' ' << エンドル ;
ために ( 隣人 : adjList [ ノード ] ) {
もしも ( ! 訪れた [ 近所の人 ] ) {
dfs_helper ( 隣人、訪問 ) ;
}
}
}
空所 DFS ( t src )
{
地図 < t、 ブール > 訪れた ;
dfs_helper ( src、訪問 ) ;
}
} ;
整数 主要 ( ) {
深さ優先検索 < 整数 > g ;
g. Add_edge ( 0 、 5 ) ;
g. Add_edge ( 0 、 7 ) ;
g. Add_edge ( 4 、 7 ) ;
g. Add_edge ( 7 、 8 ) ;
g. Add_edge ( 2 、 1 ) ;
g. Add_edge ( 0 、 6 ) ;
g. Add_edge ( 2 、 4 ) ;
g. Add_edge ( 3 、 2 ) ;
g. Add_edge ( 3 、 6 ) ;
g. Add_edge ( 7 、 5 ) ;
g. Add_edge ( 5 、 8 ) ;
g. 印刷する ( ) ;
g. DFS ( 6 ) ;
カウト << エンドル ;
}
このコードでは、実装しました DFS 上記の疑似コードに従うアルゴリズム。 12 ペアのノードがあります。クラスを定義しました」 G これは、訪問済みノードと未訪問ノードを表す頂点 a と b を持つグラフを表します。
出力
結論
DFS は、グラフ内のサイクルを見つけたり、グラフ内の接続されたコンポーネントまたはすべての頂点に関する情報を取得したりするなど、いくつかのシナリオで役立つ一般的な検索アルゴリズムです。の働きについても説明しました。 DFS 方法と例を示します。 DFS スタックを使用してテクニックを実行し、ツリーでも使用できます。