Dijkstra(迪傑斯特拉)算法的 java 實現

迪傑斯特拉算法解決的問題是:

在一個有向圖中,求圖中一個節點到其他所有節點的最短距離

算法思路:

每次選取一個離出發點最近且未標記的節點,調整出發點到以這個節點爲中心的周邊節點的最短距離。這個過程持續 n - 1 次,直到所有節點都遍歷完畢。

假設有一個這樣的圖(圖片出處:Dijkstra算法Java實現):

求節點 1 到其他節點的最短距離,代碼實現如下:

public class Test {
    public static void main(String[] args) {
        int MAX = Integer.MAX_VALUE;    // 無法到達時距離設爲 Integer.MAX_VALUE
        int[][] weight={
                {0,1,12,MAX,MAX,MAX},
                {MAX,0,9,3,MAX,MAX},
                {MAX,MAX,0,MAX,5,MAX},
                {MAX,MAX,4,0,13,15},
                {MAX,MAX,MAX,MAX,0,4},
                {MAX,MAX,MAX,MAX,MAX,0}
        };
        int start = 0;  // 選擇出發點
        System.out.println(Arrays.toString(solution(weight,start)));
    }

    private static int[] solution(int[][] weight, int start) {
        boolean[] visit = new boolean[weight.length]; // 標記某節點是否被訪問過
        int[] res = new int[weight.length];     // 記錄 start 點到各點的最短路徑長度
        for (int i = 0; i < res.length; i++) {
            res[i] = weight[start][i];
        }

        // 查找 n - 1 次(n 爲節點個數),每次確定一個節點
        for(int i = 1; i < weight.length; i++) {
            int min = Integer.MAX_VALUE;
            int p = 0;
            // 找出一個未標記的離出發點最近的節點
            for(int j = 0; j < weight.length; j++){
                if(j != start && !visit[j] && res[j] < min){
                    min = res[j];
                    p = j;
                }
            }
            // 標記該節點爲已經訪問過
            visit[p] = true;

            for (int j = 0; j < weight.length; j++){
                if (j == p || weight[p][j] == Integer.MAX_VALUE) {  // p 點不能到達 j
                    continue;
                }
                if (res[p] + weight[p][j] < res[j]){
                    res[j] = res[p] + weight[p][j];  //更新最短路徑
                }
            }
        }

        return res;
    }
}

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章