1. 程式人生 > >最短路徑之Dijkstra演算法Java實現

最短路徑之Dijkstra演算法Java實現

Dijkstra演算法步驟
以下圖為例,求頂點v1到其他頂點的最短路徑
這裡寫圖片描述

  1. 初始化dis陣列,怎麼初始化呢?v1→v1設定為0,不能直接到達的設定為無窮大,能直接到達的附權值,並且定義集合T,初始化為{v1},集合T表示已經確定最短路徑的頂點,結果如下:
    這裡寫圖片描述
  2. 找出dis陣列中最小的值(不包括集合T中的頂點),這裡最小值為 10,所以v1→v3的最短路徑就是10 ,將v3加入到集合T中,T變為{v1,v3},
  3. 隨著v3加入集合T中,陣列dis會怎麼變化呢?v3→v4為50,那麼v1→v4可以通過v3中轉v1→v3→v4=10+50=60,因為60 < dis[3],所以dis[3]=60,如圖:
    這裡寫圖片描述

  4. 重複步驟2,3,直到頂點全部加入到集合T中,

此題的Java程式碼實現
上面的集合T,在程式碼中用boolean[] visited表示

public class Dijkstra {
     public static void main(String[] args) {
        int[][] graph=new int[][]{{0,Integer.MAX_VALUE,10,Integer.MAX_VALUE,30,100},
                                  {Integer.MAX_VALUE,0,5,Integer.MAX_VALUE
,Integer.MAX_VALUE,Integer.MAX_VALUE}, {Integer.MAX_VALUE,Integer.MAX_VALUE,0,50,Integer.MAX_VALUE,Integer.MAX_VALUE}, {Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE,0,Integer.MAX_VALUE,10}, {Integer.MAX
_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE,20,0,60}, {Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE,0}}
; int[] dis=new int[6]; boolean[] visited=new boolean[6]; visited[0]=true; for(int i=0;i<6;i++) dis[i]=graph[0][i]; dijkstra(graph, dis, visited); for(int i=0;i<dis.length;i++) System.out.print(dis[i]+" "); } public static void dijkstra(int[][] graph,int[] dis,boolean[] visited){ while(true){ int min=Integer.MAX_VALUE; int index=-1; for(int i=0;i<dis.length;i++){ if(visited[i]) continue; else{ if(dis[i]<min){ index=i; min=dis[i]; } } } if(index==-1) break; visited[index]=true; for(int i=0;i<graph.length;i++){ if(graph[index][i]!=Integer.MAX_VALUE){ dis[i]=dis[i]<(min+graph[index][i])?dis[i]:min+graph[index][i]; } } } } }