1. 程式人生 > >Dilkstra最短路徑算法

Dilkstra最短路徑算法

路徑 如果 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最短路徑算法