1. 程式人生 > >圖的資料結構及遍歷演算法

圖的資料結構及遍歷演算法

圖的鄰接矩陣結構:

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);
                    }
                }
            }
        }
    }
}