標籤:length static color ++ site 另一個 最短路徑 code stat
迪傑斯特拉演算法(有向圖)
一、演算法的大概流程:
1.設一個點為出發點start點,然後先去尋找,這個start到其他點的最短的那個點,然後這個點便可以確定為0到此點最短點
比如[0][1]=12 [0][2]=15 [0][3]=18 [0][4]=11 ,此時0到4的最短距離一定為11,因為,如果從別的路徑經過肯定會大於這個11,所以這個最短路徑是可以確定的
2.然後將visited[0]和visited[4]進行標記,因為訪問過了之後,還需要進行下一輪的比較,並且不再去這兩個點訪問
並且比較從0->4->2和從0->2的距離進行比較,如果小的話,將0->4->2替代掉0->2的距離,一次類推將這一遍走完,然後這樣又可以確定出一個最短的點的距離
3.重複進行12
二、代碼如下
1 public class Dilkstra2 { 2 3 //自己手寫的Dilkstra最短路徑 4 public static void main(String[] args){ 5 int M=10000; 6 int [][] juzhen={ 7 {0,7,M,15,M}, 8 {3,0,5,M,M}, 9 {M,M,0,6,9,15},10 {M,4,M,0,9},11 {M,M,M,3,0},12 };13 int jLength=juzhen.length;14 int start = 0;15 int shortPath[] = new int[jLength];16 int visited[]=new int[jLength];17 int a=M;18 int k=0;19 for(int i=0;i<jLength;i++){ //這個for迴圈是為了將0到某個值都賦給最短路徑,以為了之後的更改20 shortPath[i]=juzhen[start][i];21 }22 visited[start] = 1;23 for(int p=0;p<jLength;p++){24 a=M;25 for(int i=0;i<jLength;i++){ //找出0到其餘點最短的那個26 if(visited[i]!=1&&a>shortPath[i]){27 a=shortPath[i];28 k=i;29 }30 };31 visited[k]=1;32 for(int i=0;i<jLength;i++){ //確定0到另一個最短點之後,找其他最短點,如果比0到此點小,替換之33 if(visited[i]!=1&&shortPath[k]+juzhen[k][i]<shortPath[i]){34 shortPath[i]=shortPath[k]+juzhen[k][i];35 }36 }37 }38 for(int p=0;p<jLength;p++){39 System.out.println("0到"+p+"的距離為"+shortPath[p]);40 }41 }42 }
三、0到(1,2,3,4,5)最短為5(第一步)
0,5到(1,2,3,4)距離(051和01比,短的放在這),先和第一步的比較取短的,然後組內比較,取最短的,假設得3(第二步)
0,5,3到(124)距離。。。。。重複第二步
Dilkstra最短路徑演算法