Dilkstra最短路徑算法
阿新 • • 發佈:2017-10-13
路徑 如果 system blog star ati log spa path
迪傑斯特拉算法(有向圖)
一、算法的大概流程:
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最短路徑算法