图的数据结构及遍历算法

来源:互联网 发布:cad手机制图软件 编辑:程序博客网 时间:2024/06/11 23:07

图的邻接矩阵结构:

public class GraphArray<T> {    private int[][] edges; // 邻接矩阵    private T[] vertexs; // 顶点    private int[] visited; // 是否访问    private int number; // 顶点个数    public GraphArray(int[][] edges, T[] vertexs) {        if (edges.length != edges[0].length) {            throw new RuntimeException("矩阵不符合规范");        }        if (edges.length != vertexs.length) {            throw new RuntimeException("矩阵不符合规范");        }        this.edges = edges;        this.vertexs = vertexs;        number = edges.length;        visited = new int[number];    }}

深度优先递归算法

// 深度优先递归算法void DFSTraverse() {    visited = new int[number];    for (int i = 0; i < number; i++) {        if (visited[i] == 0) {            DFS(i);        }    }}void DFS(int i) {    visited[i] = 1;    System.out.print(vertexs[i] + " ");    for (int j = 0; j < number; j++) {        if (visited[j] == 0 && edges[i][j] == 1) {            DFS(j);        }    }}

深度优先非递归算法:

// 深度优先非递归算法void depth() {    Stack<Integer> s = new Stack<Integer>();    for (int i = 0; i < number; i++) {        if (visited[i] == 0) {            // 访问顶点并入栈            s.add(i);            visited[i] = 1;            while (!s.isEmpty()) {                int j = s.pop();// 栈顶元素出栈                System.out.print(vertexs[j] + " ");                for (int k = 0; k < number; k++) {                    // 栈顶元素的邻接点(未被访问的)                    if (edges[j][k] == 1 && visited[k] == 0) {                        // 访问此邻接点并入栈                        s.add(k);                        visited[k] = 1;                    }                }            }        }    }}

广度优先算法:

// 广度优先算法void BFSTraverse() {    visited = new int[number];    Queue<Integer> queue = new LinkedList<Integer>();    for (int i = 0; i < number; i++) {        if (visited[i] == 0) {            // 访问顶点并入队            visited[i] = 1;            System.out.print(vertexs[i] + " ");            queue.add(i);            while (!queue.isEmpty()) {                int j = queue.poll();// 队头元素出队                for (int k = 0; k < number; k++) {                    // 队头元素的邻接点(未被访问)                    if (edges[j][k] == 1 && visited[k] == 0) {                        // 访问此邻接点并入队                        visited[k] = 1;                        System.out.print(vertexs[k] + " ");                        queue.add(k);                    }                }            }        }    }}
原创粉丝点击