1. 程式人生 > >迪傑斯特拉演算法Java實現

迪傑斯特拉演算法Java實現

<span style="font-size:18px;">public class Dijkstra {
    static int MAX=10000;
    public static void main(String[] args) {

        //鄰接矩陣
        int[][] weight = {
                {0,3,2000,7,MAX},
                {3,0,4,2,MAX},
                {MAX,4,0,5,4},
                {7,2,5,0,6},
                {MAX,MAX,4,6,0}
        };

        int start=0;
        int[] shortPath = Dijsktra(weight,start);
        for(int i = 0;i < shortPath.length;i++)
        {
            System.out.println("從"+start+"出發到"+i+"的最短距離為:"+shortPath[i]);
        }
    }

    //接受一個有向圖的權重矩陣,和一個起點編號start(從0編號,頂點存在陣列中)
    //返回一個int[] 陣列,表示從start到它的最短路徑長度
    public static int[] Dijsktra(int[][] weight,int start){

        int n = weight.length;
        //存放從start到其他各點的最短路徑
        int[] shortPath = new int[n];
        //存放從start到其他各點的最短路徑的字串表示
        String[] path=new String[n];
        for(int i=0;i<n;i++)
        {
            path[i] = start + "-->" + i;
        }
        //標記當前該頂點的最短路徑是否已經求出,1表示已求出
        int[] visited = new int[n];

        shortPath[start] = 0;
        visited[start] = 1;
        for(int count = 1;count <= n - 1;count++)
        {
            //選出一個距離初始頂點start最近的未標記頂點
            int k = -1;
            int dmin = Integer.MAX_VALUE;
            for(int i = 0;i < n;i++)
            {
                if(visited[i] == 0 && weight[start][i] < dmin)
                {
                    dmin = weight[start][i];
                    k = i;
                }
            }
            //將新選出的頂點標記為已求出最短路徑,且到start的最短路徑就是dmin
            shortPath[k] = dmin;
            visited[k] = 1;
            //以k為中間點,修正從start到未訪問各點的距離
            for(int i = 0;i < n;i++)
            {
                if(visited[i] == 0 && weight[start][k] + weight[k][i] < weight[start][i])
                {
                    weight[start][i] = weight[start][k] + weight[k][i];
                    path[i]=path[k]+"-->"+i;
                }
            }
        }
        for(int i=0;i<n;i++)
        {
            System.out.println("從"+start+"出發到"+i+"的最短路徑為:"+path[i]);
        }
        System.out.println("=====================================");
        return shortPath;
    }
}</span>