迪杰斯特拉算法(有向图)
一、算法的大概流程:
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)距离。。。。。重复第二步