首页 > 代码库 > 图的表示与遍历

图的表示与遍历

图的表示:连接矩阵,连接链表。

图的遍历:dfs(递归、非递归),bfs.

 

连接矩阵下各种遍历:

import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Queue;import java.util.Stack;public class Graph {    int v;    int e;    int[][] mat;    public Graph(int v) {        this.v = v;        this.e = 0;        mat = new int[v][v];    }    public void addEdge(int a, int b) {        if (mat[a][b] == 0)            e++;        mat[a][b] = 1;        mat[b][a] = 1;    }    public Iterable<Integer> adj(int a) {        List<Integer> res = new ArrayList<Integer>();        for (int i = 0; i < v; i++) {            if (mat[a][i] != 0) {                res.add(i);            }        }        return res;    }    public void dfsNonRecur() {        boolean[] vis = new boolean[v];        for (int i = 0; i < v; i++) {            if (!vis[i]) {                dfsNonRecur(i, vis);            }        }        System.out.println();    }    public void dfs() {        boolean[] vis = new boolean[v];        for (int i = 0; i < v; i++) {            if (!vis[i]) {                dfs(i, vis);            }        }        System.out.println();    }    private void dfs(int i, boolean[] vis) {        vis[i] = true;        System.out.print(i + " ");        for (Integer each : adj(i)) {            if (!vis[each])                dfs(each, vis);        }    }    private void dfsNonRecur(int i, boolean[] vis) {        Stack<Integer> stack = new Stack<Integer>();        vis[i] = true;        stack.push(i);        System.out.print(i + " ");        while (!stack.isEmpty()) {            Integer top = stack.peek();            boolean finished = true;            for (Integer each : adj(top)) {                if (!vis[each]) {                    System.out.print(each + " ");                    vis[each] = true;                    stack.push(each);                    finished = false;                    break;                }            }            if (finished) {                if (!stack.isEmpty())                    stack.pop();            }        }    }    public void bfs() {        boolean[] vis = new boolean[v];        for (int i = 0; i < v; i++) {            if (!vis[i]) {                bfs(i, vis);            }        }        System.out.println();    }    public void bfs(int start, boolean[] vis) {        Queue<Integer> queue = new LinkedList<Integer>();        queue.add(start);        vis[start] = true;        System.out.print(start + " ");        while (!queue.isEmpty()) {            Integer out = queue.remove();            for (Integer each : adj(out)) {                if (!vis[each]) {                    vis[each] = true;                    queue.add(each);                    System.out.print(each + " ");                }            }        }    }    public static void main(String[] args) {        Graph g = new Graph(5);        g.addEdge(0, 1);        g.addEdge(0, 3);        g.addEdge(1, 2);        g.addEdge(3, 4);        g.dfs();        g.dfsNonRecur();        g.bfs();    }}

 

参考资料:

http://algs4.cs.princeton.edu/41undirected/AdjMatrixGraph.java.html

http://algs4.cs.princeton.edu/41undirected/Graph.java.html

http://blog.csdn.net/lalor/article/details/6845788

图的表示与遍历