最初のステップ、構造図、図のような構造。
この実施形態は、図1の構成の二種類を有している。二次元配列A +マップのリストを、図は、まばらにマッププラス鎖、以下に示すコードを使用して構成されました
プライベート静的地図<文字、リスト<文字>> buildGraph(){ 地図<文字、リスト<文字>>グラフ=新しいHashMapの<>(); リスト<文字> aListの=新しいLinkedListの<>(は、Arrays.asList( 'B'、 'C')); リスト<文字> bList =新しいLinkedListの<>(は、Arrays.asList( 'A'、 'C'、 'D')); リスト<文字> CLIST =新しいLinkedListの<>(は、Arrays.asList( 'A'、 'B'、 'D'、 'E')); リスト<文字> DLIST =新しいLinkedListの<>(は、Arrays.asList( 'B'、 'F'、 'E'、 'C')); リスト<文字> ELIST =新しいLinkedListの<>(は、Arrays.asList( 'C'、 'D')); 一覧<文字> フィールド・リスト=新しいLinkedListの<>(は、Arrays.asList( 'D')); graph.put( 'A'、aListの)。 graph.put( 'B'、bList)。 graph.put( 'C'、CLIST)。 graph.put( 'D'、DLIST)。 graph.put( 'E'、ELIST)。 graph.put( 'F'、フィールド・リスト)。 グラフを返します。 }
キーのノードの地図表現は、値が隣接ノードのリストです。
BFSは、BFS:アイデアは、現在のノードにアクセスすることで、そのように現在のノードの隣接ノードを訪問し、そして。FIFOキューの特性を使用して、それが層によって横断することができます。
深さ優先探索BFS:アイデアは、現在のノードにアクセスすることで、道路のバリアまで行き、その後、戻ってアクセス権を持っています。
パブリック静的無効メイン(文字列[] args){ 地図<文字、リスト<文字>>グラフ= buildGraph()。 DFS(グラフ、 'C')。 BFS(グラフ、 'D')。 } プライベート静的地図<文字、リスト<文字>> buildGraph(){ 地図<文字、リスト<文字>>グラフ=新規HashMapの<>(); リスト<文字> aListの=新しいLinkedListの<>(は、Arrays.asList( 'B'、 'C')); リスト<文字> bList =新しいLinkedListの<>(は、Arrays.asList( 'A'、 'C'、 'D')); リスト<文字> CLIST =新しいLinkedListの<>(は、Arrays.asList( 'A'、 'B'、 'D'、 'E')); 一覧<文字> DLIST =新しいLinkedListの<>(は、Arrays.asList( 'B'、 'F'、 'E'、 'C')); リスト<文字> ELIST =新しいLinkedListの<>(は、Arrays.asList( 'C'、 'D')); リスト<文字>フィールド・リスト=新しいLinkedListの<>(は、Arrays.asList( 'D')); graph.put(aListのの'A'); graph.put( 'B'、Blist); graph.put( 'C' 、CLIST); graph.put( 'D'、DLIST); graph.put( 'E'、ELIST); graph.put( 'F.'、フィールド・リスト); グラフを返す; } / ** *深さ優先探索 * @図PARAMグラフをトラバース * @param sの出発点 * / パブリック静的な無効DFS(地図<文字、リスト<>>グラフキャラクター、文字S){ //横断ノード =新しいHashSetの訪れを設定<文字> <> (); スタック<文字> =新しい新しいスタックスタック<>(); stack.push(S); (!stack.empty()){中 しばらく(!キュー。空の()){ 文字accessC = stack.pop()。 (もし!visited.contains(accessC)){ System.out.print( " - >" + accessC)。 visited.add(accessC)。 } graph.get(accessC).forEach(C - > { IF(visited.contains(C)){! stack.push(C); } })。 } } 公共の静的な無効BFS(地図<文字、リスト<文字>>グラフ、文字S){ //走过的节点 設定<文字>訪問=新しいHashSetの<>(); キュー<文字>キュー=新しいLinkedListは<>(); queue.offer(S); 文字accessC = queue.poll()。 (もし!visited.contains(accessC)){ System.out.print( " - >" + accessC)。 visited.add(accessC)。 } graph.get(accessC).forEach(C - > { IF(visited.contains(C)){! queue.offer(C); } })。 } }