DFS検索アルゴリズム - (1)基本的なグラフのトラバーサルは間違いなくやります!の!理解!

なるほど」からのコンテンツの要約!アルゴリズム!"

年生鶏肉料理の両方として、DFSが行うことができないかの質問を行います!

第四ブック検索の両方(!)チキン料理....「なるほどアルゴリズム」の章の二年生として、私はどこから始めれば理解していなかった、第五章を見て走りました。本要約の結果は遠い未知の友人へと自分のために便利....抜粋を見て理解します。

次の言語は重要理解するために、負担する彼のような正確な場所ではありません。

その円を参照するために、以下に示すように深さの検索アルゴリズムは、(醜い図そのブラインド塗装)するためのグラフです。

 

 

 

道路から始まる「深さ優先」は、黒帯道路が道路を続けるために戻って歩いて行くときその後、我々はトラバース黒行きます。つまり、1つのスタートで始まり、5はその後ウォークが、戻ら2に戻って取得するようになった、2を歩いた、そして、6は行くことがあることがわかった6行ってきました。そして、彼は歩きます。そして、バック2に、しかし、すべての枝2が訪問されている必要があり、それはバックステッピングは、1を行ってきました。戻る1の後、2はこの道を実行している、我々は3に行き、その後、7に行き、その後行く、他の枝が1に戻って上に行くことはできませんバック3,3に歩きます4

 

1256374:それからアクセス順序は図(ノードが重複しない)であります

道路が完了している場合、例えば、2 5から行き、最後には、私たちは、接合頂点2に戻らなければなりません。プロセスから5-2をバックトラッキングと呼ばれています。

だから、どのようにそれの絵を保存するには?私たちは、ARR格納する2次元配列を使用します。

 

これらの図に示すように、第i行j列目の二次元アレイは、そこエッジ場合iがjで頂点に頂点によって表されます。1は全く縁が空でなく、エッジを表現(プログラミング時に9999に割り当てることができ、私は必要性を排除する面倒を描いた)、行と列の二次元アレイは、私の割り当てをゼロに等しいです。

この図は、「無向グラフ」ですので、この図の上に、主対角に関して対称で、見ることができます。この図は、1から2まで及び2から1に、全くエッジ方向でない同じである、ARRので、[2] [1] = ARR [1] [2] = 1。

 

ここで達成するためのコードは次のとおりです。

本は[]配列はすべて、この初期値を開始しており、訪問されていないこと、0です。1を訪問するために割り当てられています。

少し知識を知る必要もあり、戻り値は最初の関数の終わりを示し、私のコードと2つのリターン内にある、第2の戻りは、再帰関数の特殊な使用であるDFS()関数で、収益を意味します。例えば:それはDFS(5)、コードを実行する第2の戻りコードに遭遇し、次いで(DFSが返される)DFS(2)になった実行に関する関数であり、このプロセスはバックトラックされます。

1  空隙 DFS(INT CUR)// CURの頂点の現在の数である
2  {
 3      のprintf(" %のD "、CUR); // 横断点を印刷するために
4      SUM ++; // SUMは、グローバル変数であり、 0の初期値。各アクセスポイント、合計++。
5      IF(SUM == N-)
 6。         リターン ; // N-グローバル変数、総ポイント数。合計は== nは、アクセスポイントがある場合は、exit関数を終了します。
7      
8。     ためINT I = 1 ; I <= N; Iは++)// ポイント1からポイント番号に順次試行をN、CUR点に接続されている人を参照
。9      {
 10          IF(ARR [CUR] [I] = = 1本&& [I] == 0// この点がアクセスされていないとCURと接続されている場合
。11          {
 12は、              本[I] = 1 ; // 訪問としてマークされ、この点
13は、              DFS(I); //は再帰的、この点から、我々はさらに続けたトラバースし続け
14          }
 15      }
 16      リターン ; // すべての点が接続されている場合CURがDFS()にアクセスし、戻る
。17 }

 

 

次のように完全なコードは次のとおりです。

1つの#include <iostreamの>
 2の#include <cstdioを>
 3  使用 名前空間STD;
 4  
。5  INTブック[ 101 ]、SUM、N-、ARR [ 101 ] [ 101 ];
 6  
。7  ボイド DFS(INT CUR)// CUR電流頂点の数
8。 {
 9。      のprintf(" %のD "、CUR); //は順次ドットを印刷するトラバース
10      SUMを++; // SUMは初期値が0である、グローバル変数です。各アクセスポイント、合計++。
11      IF(SUM == N-)
 12が         返します// n型などのグローバル変数、総ポイント数。合計は== nは、アクセスポイントがある場合は、exit関数を終了します。
13は、 
14      のためにINT I = 1 ; I <= n iは++)// CUR点に接続されている人を確認するために、点1から点の数nに順次試みる
15      {
 16          IF(ARR [CUR] [I] = = 1 &&ブック[I] == 0// この点がアクセスされていないとCURと接続されている場合
。17          {
 18で              ブック[I] = 1 ; // 訪問したように、この点がマーク
19。              DFS(I); // 再帰はさらにトラバースを継続した。この時点から続行
20          }
 21である     }
 22で     返す ; //すべてのポイントがアクセスCUR、およびDFS(に戻る接続されている場合)
23である }
 24  
25  
26であり、 
27  のint main()の
 28  {
 29      = SUM 0 ;
 30      int型のM、A、B、
 31である      CIN> > N >> M; // mおよびnは、多くの側面がいくつかのポイントを表現
32      のためにINT I = 1。 ;私は<= N; I ++は){
 33がある         ためINT J = 1 ; J <= N; J ++ ){
 34は、             IF(I == J)
 35                  ARR [I]は[J]が= 0 ;
 36              
37 [                 ARR [I] [J] = 9999999 ; // マークされていない側は999999接続
38である         }
 39      }
 40  
41である     // 頂点の間、これらのエッジを読み取る
42である     ためint型 I = 0 ; iがmを<; I ++は43は     、{
 44が          CIN >> A >> B;
 45          ARR [A] [B] = 1 ;
 46である          ARR [B] [A] = 1 ; // による無向グラフを、2つのマークがなければなりません。私は前に述べた
47      }
 48      [ブック1 ] = 1 ; // 1番から頂点。1つのラベル番号は、頂点アクセスされました
49の      DFS(1 )。
50  
51      GETCHAR(); GETCHAR()。
52  
53  
54      戻り 0 ;
55 }

 

OK細かいので、簡単なグラフトラバーサルの書き込みを続行するために、次の終了と言います

 

おすすめ

転載: www.cnblogs.com/juzijuziju/p/11461471.html