1. 程式人生 > >有向圖的廣度、深度優先遍歷

有向圖的廣度、深度優先遍歷

add println adjacency 工具 pri pty author ted src

基於List存儲的鄰接表,一個工具類,創建一個有向圖:

技術分享

代碼如下:

package com.daxin;

import java.util.ArrayList;
import java.util.List;

/** 
 * 
 * @author  daxin 
 * 
 * @email [email protected]
 * 
 * @date 2017年9月24日 下午5:36:56
 * 
 */
class Node {

    public Node(int val) {
        this.val = val;
    }

    int val;
    
boolean visited; } public class BuildGraph { /** * 基於鄰接表存儲的有向圖 * * * * @return 返回有向圖 */ public static List<List<Node>> buildGraph() { List<List<Node>> G = new ArrayList<>(); Node a = new Node(0); Node b = new
Node(1); Node c = new Node(2); Node d = new Node(3); Node e = new Node(4); List<Node> al = new ArrayList<>(); al.add(a); al.add(b); al.add(c); List<Node> bl = new ArrayList<>(); List<Node> cl = new
ArrayList<>(); List<Node> dl = new ArrayList<>(); List<Node> el = new ArrayList<>(); bl.add(b); bl.add(d); cl.add(c); cl.add(d); dl.add(d); dl.add(e); el.add(e); G.add(al); G.add(bl); G.add(cl); G.add(dl); G.add(el); return G; } }

有向圖的深度優先遍歷:

package com.daxin;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author daxin
 * @email [email protected]
 * @date 2017年9月24日 下午3:08:20
 * 
 */

public class Dfs {

    public static void main(String[] args) {
        dfsGraph(BuildGraph.buildGraph());
    }

    public static void dfsGraph(List<List<Node>> adjacencyList) {

        // vl是鄰接表中的每一行的一個list
        for (List<Node> vl : adjacencyList) {
            dfs(adjacencyList, vl);

        }

    }

    public static void dfs(List<List<Node>> adjacencyList, List<Node> vhead) {

        for (int i = 0; i < vhead.size(); i++) {
            if (vhead.get(i).visited == false) {
                // 設置訪問過
                vhead.get(i).visited = true;
                // 遍歷其value
                System.out.println(vhead.get(i).val);
                // 遞歸調用,進行深度遍歷
                dfs(adjacencyList, adjacencyList.get(vhead.get(i).val));
            }
        }

    }

}

有向圖的廣度優先遍歷:

package com.daxin;

import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * 
 * @author daxin
 * 
 * @email [email protected]
 * 
 * @date 2017年9月24日 下午5:39:19
 * 
 */
public class Bfs {
    public static void main(String[] args) {
        bfsGraph(BuildGraph.buildGraph());
    }

    public static void bfsGraph(List<List<Node>> adjacencyList) {

        for (int i = 0; i < adjacencyList.size(); i++) {
            bfs(adjacencyList, adjacencyList.get(i));
        }

    }

    public static void bfs(List<List<Node>> adjacencyList, List<Node> vhead) {

        Queue<Node> q = new LinkedList<>();
        q.add(vhead.get(0));

        while (!q.isEmpty()) {
            Node n = q.remove();
            List<Node> vl = adjacencyList.get(n.val);
            if (n.visited == false) {
                System.out.println(n.val);
                n.visited = true;
            }
            for (int i = 0; i < vl.size(); i++) {
                //如果沒有訪問的話,則追加到隊列
                if (adjacencyList.get(n.val).get(i).visited == false)
                    q.add(adjacencyList.get(n.val).get(i));
            }

        

        }

    }
}

有向圖的廣度、深度優先遍歷