なるほど」からのコンテンツの要約!アルゴリズム!"
年生鶏肉料理の両方として、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細かいので、簡単なグラフトラバーサルの書き込みを続行するために、次の終了と言います