C++ で深さ優先検索 (DFS) を実装する方法

C De Shensa You Xian Jian Suo Dfs Wo Shi Zhuangsuru Fang Fa



深さ優先検索 (DFS) は、データ構造内のグラフまたはツリーのすべてのノードを検索するために使用される強力な再帰アルゴリズムです。特定の頂点を選択して検索を開始し、バックトラックする前に、各ブランチに沿って可能な限りグラフの探索を開始します。バックトラッキングは、 DFS アルゴリズムは、訪問する近隣ノードがないノードに近づきます。隣接ノードのないノードに近づくと、前のノードに戻ります。

DFS の場合、探索中のノードはスタック データ構造に格納されます。未探索のノードにつながるエッジは「」と呼ばれます ディスカバリー エッジ ‘ すでに訪問したノードにつながるエッジは呼び出されます ‘ ブロック エッジ '。 DFS プログラマーがグラフ内の接続されたコンポーネントまたはサイクルを見つけたい場合のシナリオで役立ちます。

この記事のガイドラインに従って実装してください DFS C++で。







C++ での DFS の実装

次のセクションでは、その方法について説明します DFS C++ で実装されています。与えられた手順に従って実装することができます DFS .



  1. ツリーまたはグラフのルート ノードをスタックに挿入します。
  2. スタックの一番上の項目を訪問済みリストに追加します。
  3. 訪問したノードに隣接するすべてのノードを検出し、まだ訪問していないノードをスタックに追加します。
  4. スタックが空になるまで、手順 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 スタックを使用してテクニックを実行し、ツリーでも使用できます。