[データ構造とアルゴリズム]のDFS深さ優先探索と幅優先探索BFS

 最初のステップ、構造図、図のような構造。

   

 

 この実施形態は、図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); 
                } 
            })。
        } 
    }

  

おすすめ

転載: www.cnblogs.com/zhengwangzw/p/11482085.html