【算法】Dijkstra 求最短路徑算法

1.dijkstra算法簡介

Dijkstra算法是由E.W.Dijkstra於1959年提出,又叫迪傑斯特拉算法,它應用了貪心算法模式,是目前公認的最好的求解最短路徑的方法。算法解決的是有向圖中單個源點到其他頂點的最短路徑問題,其主要特點是每次迭代時選擇的下一個頂點是標記點之外距離源點最近的頂點。但由於dijkstra算法主要計算從源點到其他所有點的最短路徑,所以算法的效率較低。


2.思路

1、把所有結點分成兩組:
      第一組:包括已經確定最短路徑的結點;
      第二組:包括尚未確定最短路徑的結點。
2、開始時,第一組只包含起點,第二組包含剩餘的點;
3、用貪心的策略,按最短路徑長度遞增的順序把第二組的結點加到第一組去,直到v0可達的所有結點都包含於第一組中。在這個過程中,不斷更新最短路徑,總保持從v0到第一組各結點的最短路徑長度dist都不大於從v0到第二組任何結點的路徑長度。
4、每個結點對應一個距離值,第一組結點對應的距離就是v0到此結點的最短路徑長度,第二組結點對應的距離值就是v0由第一組結點到此結點的最短路徑長度。
5、直到所有的頂點都掃描完畢(v0可達的所有結點都包含於第一組中),找到v0到其它各點的所有最短路徑。

 動畫演示:http://www.jcc.jx.cn/kejiandb/Dijkstra.swf

3. 代碼實現:

//初始化路徑,都爲最大值。
int path[][]=new int[n+1][n+1];
for(int i=1;i<n+1;i++){
   for(int j=1;j<n+1;j++)
      path[i][j]=Integer.MAX_VALUE;
  }
//這裏需要輸入path[i][j]的具體內容,如果有重複數據的話,需要更新路徑爲最小值。
int minLen[]=new int[n+1];
//visit初始爲0,防止回溯
int visit[]=new int[n+1];
//初始化1到其他點的距離。
for(int i=1;i<n+1;i++){
   minLen[i]=path[1][i];
  }
void Dijkstra(){
minLen[1]=0;
visit[1]=1;
int minj=1;
for(int i=1;i<n+1;i++){
    int min=Integer.MAX_VALUE;
    for(int j=1;j<n+1;j++){
        if(visit[j]==0 && minLen[j]<min){
            min=minLen[j];
            minj=j;
        }
    }
visit[minj]=1;
for(int j=1;j<n+1;j++){
    if(visit[j] == 0 && minLen[minj] != Integer.MAX_VALUE&&path[minj][j]!= 
Integer.MAX_VALUE&&minLen[j]>(minLen[minj]+path[minj][j])){
    minLen[j]=minLen[minj]+path[minj][j];
    }
    }
}
}


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