深さ優先度トラバーサル
深さの優先順位は、一人の迷路を歩くことに似ています。
図に示すように、開始点からエッジを選択して、次の頂点まで歩きます。頂点に到達する前に、この頂点が到着したことがマークされています。
マークされた頂点が来たら、前の頂点に戻り、到達していない頂点を選択します。
退却された交差点への通過がない場合は、後退し続けます。
接続されたコンポーネントについては、コンセプトを見てください:無向グラフGの極端に接続されたサブグラフはGの接続コンポーネントと呼ばれます。つまり、接続されたグラフ自体の接続コンポーネントは1つだけで、接続されていない無向グラフには複数の接続されたコンポーネントがあります。
具体的な例を見てみましょう。
パッケージcom.dataStructure.graph; //不正なグラフのユニコムコンポーネントを見つけますパブリッククラスコンポーネントのユニコムコンポーネント{プライベートグラフ; //入力プライベートブールを格納するための配列[]訪問したプライベートintコンポーネントを保存;グラフ){this.graph = graph; componentcount = 0; //接続されたコンポーネントの初期数は0に訪問= new boolean [graph.v()]; mark = new int [graph.v()]; for(int i = 0; i <graph.v(); i ++){visited [i] = false; (int i = 0; i <graph.v(); i ++){// visitedノードの深さ優先度トラバーサルの場合、-1}としてマークされています(! {visited [i] = true; // node iにアクセスされましたmark [i] = componentcount; // node iは、(int node:graph.adjacentnode(i))の現在の数の接続コンポーネント(マーク)に属します。 boolean isconnected(int v、int w){return mark [v] == mark [w]; // 2つのノードが接続されたコンポーネントのマークに基づいて接続されているかどうかを判断します。 //グラフの参照// private boolean []訪問。 // DFSプロセス中にノードにアクセスされるかどうか// private int ccount; //中国ユニコムコンポーネントの数を記録する// private int [] id; //各ノードの対応する中国ユニコムコンポーネントマーク//ノードvのアクセスステータスはtrueに設定されています// id [v] = ccount; //ノードvの対応する中国ユニコムマークは、ccountに設定されています/// dfs(i); //} //} /// //コンストラクターは、不明瞭なグラフの接続されたコンポーネント//パブリックコンポーネントの接続コンポーネント(グラフ){/// // algorithm initialization // g = gragh;ノードが配列ストレージグラフに属するコンポーネントg // id = new int [gv()]; /// // //接続されたコンポーネントの数は0 // ccount = 0; //// //訪問されたすべての配列を偽に設定します。 (int i = 0; i <gv(); i ++){// visited [i] = false; // id [i] = -1; // //グラフのユニコムコンポーネントを見つける(int i = 0; i <gv(); i ++)// firsed [i ++)// // //深さ優先度トラバーサル// dfs(i); // ccount ++; //} //} ///グラフのユニコムコンポーネントの数を返す// int count(){// return ccount; //} isconnected(int v、int w){// assert v> = 0 && v <gv(); // assert w> = 0 && w <gv(); // return id [v] == id [w]; //} //}パスコンポーネントの数は3です
要約します
上記は、この記事のすべてのコンテンツであり、Javaプログラミングの実装では、Deep Priority Traversal and Connectivity Componentコードの例の実装です。私はそれが誰にでも役立つことを願っています。欠点がある場合は、それを指摘するためにメッセージを残してください。 wulin.comをフォローすると、もっと得られます。