迪杰斯特拉算法代码详解(java)

迪杰斯特拉这是一个按路径长度递增次序产生最短路径的算法。具体代码如下:

/*1*/import java.util.Scanner;
/*2*/class Graph{                         
/*3*/ int[][] edge;   //图的邻接矩阵                    
/*4*/ int numPoint;   //图中顶点数目                   
/*5*/ int numEdeges;  //图中的边数目                 
/*6*/ public Graph() {}
/*7*/ public Graph(int numPoint,int numEdeges)
/*8*/ {
/*9*/  this.numEdeges=numEdeges;
/*10*/  this.numPoint=numPoint;
/*11*/  int a=2000;
/*12*/  edge= new int[][]{
/*13*/    {a,1,5,a,a,a,a,a,a},
/*14*/    {1,a,3,7,5,a,a,a,a},
/*15*/    {5,3,a,a,1,7,a,a,a},
/*16*/    {a,7,a,a,2,a,3,a,a},
/*17*/    {a,5,1,2,a,3,6,9,a},
/*18*/    {a,a,7,a,3,a,a,5,a},
/*19*/    {a,a,a,3,6,a,a,2,7},
/*20*/    {a,a,a,a,9,5,2,a,4},
/*21*/    {a,a,a,a,a,a,7,4,a}
/*22*/        };
/*23*/ }
/*24*/}
/*25*/public class dsd {
/*26*/    public static void Shortest_path_Dijstra(Graph a,int[] Pathara,int[] ShortPath_table)
/*27*/    {
/*28*/   int v,w,k = 0,min;
/*29*/   int[] km=new int[a.numPoint];
/*30*/   for(v=0;v<a.numPoint;v++)
/*31*/   {
/*32*/  km[v]=0;                         
/*33*/  ShortPath_table[v]=a.edge[0][v];         
/*34*/  Pathara[v]=0;            
/*35*/   }
/*36*/   ShortPath_table[0]=0;              
/*37*/   km[0]=1;                            
/*38*/   for(v=1;v<a.numPoint;v++)
/*39*/   {
/*40*/  min=2000;
/*41*/  for(w=0;w<a.numPoint;w++)
/*42*/  {
/*43*/   if(km[w]==0&&ShortPath_table[w]<min)
/*44*/   {
/*45*/    k=w;
/*46*/    min=ShortPath_table[w];
/*47*/   }
/*48*/  }
/*49*/  km[k]=1;                       
/*50*/  for(w=0;w<a.numPoint;w++)
/*51*/  {
/*52*/   if(km[w]==0&&(min+a.edge[k][w])<ShortPath_table[w])
/*53*/   {
/*54*/    ShortPath_table[w]=min+a.edge[k][w];
/*55*/    Pathara[w]=k;
/*56*/   }
/*57*/  }
/*58*/      }
/*59*/   for(int i=0;i<a.numPoint;i++)
/*60*/   {
/*61*/    System.out.println("Pathara:"+Pathara[i]);
/*62*/    System.out.println("ShortPath_table:"+ShortPath_table[i]);
/*63*/   }
/*64*/    }
/*65*/ public static void main(String[] args)
/*66*/   {
/*67*/  Graph a=new Graph(9,16);
/*68*/  int[] Pathara=new int[a.numPoint];
/*69*/  int[] ShortPath_table=new int[a.numPoint]
/*70*/  Shortest_path_Dijstra(a,Pathara,ShortPath_table);
/*71*/   }
/*72*/}

上述代码是找出v0,到v8的最短路径,代码所用到的图如下:
迪杰斯特拉算法代码详解(java)_第1张图片
代码讲解:
**1~24行代码:**这几行代码是用来创建具体实例所用到的图,这两我们用的是上面所展示的图,其中a代表的是一个最大值,既图中所有权值都无法到达的一个距离,值可以任取,但条件是不能小于图中权值的最大值。表示图的方式用到的是邻接矩阵。
**26~64行代码:**这几行代码是我们具体实现迪杰斯特拉算法的核心代码,详细讲解见下:
**29行代码:**这里定义了一个数组,数组用来标记顶点是否已经被访问,或者理解为顶点是否已经包含在最短路径中
**30~34行代码:**这几行代码主要是为了给数组赋初值,km数组全部赋值为0表示顶点均未被访问 过,ShortPath_table数组这里是用来保存最短路径的长度,ShortPath_table[2]就表示v0到v2的最短路径长度,即为1,这里将其赋值为邻接矩阵的第一行,是应为这里我们用到的是v0做为路径的起点,最后Pathara数组用来记录最短路径,打个比方,这个程序到最后Pathara数组变为了{0,0,1,4,2,4,3,6,7},如何理解这个数组,假如我们要查找v0到v8的最短路径,从Pathara[8]=7开始就是v8->v7,再看Pathara[7]=6,所以v8->v7->v6,再看Pathara[6]=3,则路径变为v8->v7->v6->v3,接着看Pathara[3]=4,路径变为v8->v7->v6->v3->v4,然后Pathara[4]=2,路径继续变化v8->v7->v6->v3->v4->v2,接下来Pathara[2]=1,路径延长到v8->v7->v6->v3->v4->v2->v1,最后Pathara[1]=0,到达v0,也得出v8到v0最短路径v8->v7->v6->v3->v4->v2->v1->v0,以上述的方法,可以从Pathara数组中得出任何点到v0得最短路径。这里将Pathara数组元素全部初始化为0。
**36~37行代码:**这两行代码ShortPath_table[0]=0表示v0到v0得最短路径显而易见为0,km[0]=1,表示v0已加入最短路径中
**38行代码:**这个for循环每一个循环都可以求出v0到一个顶点的最短路径
**41行代码:**这个嵌套的for循环的作用是找出ShortPath_table数组中的最小值,由上面我们知道ShortPath_table数组用来记录v0到各个顶点最短路径的长度,并记录最短路径上顶点的下标。
**49行代码:**将km[k]设置为1,k表示已知v0到vk最短路径上,因此将km[k]设置为1,表示vk已经加人最短路径中
**50行代码:**这个循环主要是用来修改ShortPath_table数组和记录Pathara数组。这里比较难理解一点,打个比方我由41行那个for循环可以找出v0到v1比v0到v2路径要短,所以k值会记为1,min值为1,km[1]会设置为1,此时到了50行循环,我吗们会发现ShortPath_table[2]会大于1+3即v1到v2的路径长度会小于v0直接到v2的长度,所以我们得修改ShortPath_table数组保存的最短路径值得值,并得到了v0到v2的最短路径并记录到Pathara数组中。

你可能感兴趣的:(算法)