最短距離 Dijkstra

近期我寫過了Prim和Kruskal的最小生成樹算法,今天,我利用下班時間,給大家分享下Dijkstra的最短距離算法,希望有助於各位的學習。
代碼如下:
package org.tree;

import java.util.Arrays;

public class DijkstraArithmetic {

    private static final int INFINITE = 9999;
    public static int[] Pathmatirx ;
    public static int[] shortPathTable ;
   
    public static void shortestPathDijkstra(int[][] matirx, int head, int vertexsSize){
        Pathmatirx = new int[vertexsSize];                   // 用於存儲最短路徑下標的數組
        shortPathTable = new int[vertexsSize];               // 用於存儲到各點最短路徑的權值和
       
        int[] flags = new int[vertexsSize];
       
        // 得到該頂點的所有的權
        for (int i = 0; i < vertexsSize; i++) {
            shortPathTable[i] = matirx[head][i];
        }
       
        // 初始化
        flags[head] = 1;                                      // head頂點到head頂點不需要求路徑
        shortPathTable[head] = 0;                             // head頂點到head頂點爲0
       
        for (int i = 1; i < vertexsSize; i++) {
            int min = INFINITE;
            int minValueIndex = Integer.MAX_VALUE;
           
            // 找到最小的路徑,並通過minValueIndex參數標識
            for (int j = 0; j < vertexsSize; j++) {
                if(flags[j] != 1 && shortPathTable[j] < min){
                    min = shortPathTable[j];
                    minValueIndex = j;
                }
            }
           
            // 將目前找到最近的頂點置爲1
            flags[minValueIndex] = 1;
           
            // 修正當前最短路徑及距離
            for (int j = 0; j < vertexsSize; j++) {
                if( flags[j] != 1 && (min+matirx[minValueIndex][j] < shortPathTable[j])){
                    // 以下說明有更短的路徑存在,修改shortPathTable和Pathmatirx
                    shortPathTable[j] = min+matirx[minValueIndex][j];
                    Pathmatirx[j] = minValueIndex;
                }
            }
           
        }
       
    }
   
    public static void main(String[] args) {
        int[][] matrix = new int[5][5];
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix.length; j++) {
                matrix[i][j] = INFINITE;
            }
        }
        matrix[0][1] = 10 ;
        matrix[1][0] = 10 ;
       
        matrix[1][3] = 13 ;
        matrix[3][1] = 13 ;
       
        matrix[0][4] = 7 ;
        matrix[4][0] = 7 ;
       
        matrix[0][2] = 3 ;
        matrix[2][0] = 3 ;
       
        matrix[3][4] = 5 ;
        matrix[4][3] = 5;
       
        matrix[2][4] = 2 ;
        matrix[4][2] = 2 ;
       
        shortestPathDijkstra(matrix,3,5);
       
        // 以下是 頂點 matrix[3] 到各個頂點的短距離
        for (int c = 0; c < 5; c++) {
            System.out.println("頂點3到頂點"+c+"的最短距離是"+shortPathTable[c]);
        }
       
    }
   
}

注意:此算法是我在書上看到的,我僅僅只是將原來的C代碼翻譯成java代碼,所以寫的原創,請勿亂噴,希望大家學習開心!!!
(時間原因,這裏我就不解釋了,網上有資料的)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章