最短路径之Dijkstra算法Java实现

Dijkstra算法步骤
以下图为例,求顶点v1到其他顶点的最短路径
《最短路径之Dijkstra算法Java实现》

  1. 初始化dis数组,怎么初始化呢?v1→v1设置为0,不能直接到达的设置为无穷大,能直接到达的附权值,并且定义集合T,初始化为{v1},集合T表示已经确定最短路径的顶点,结果如下:
    《最短路径之Dijkstra算法Java实现》
  2. 找出dis数组中最小的值(不包括集合T中的顶点),这里最小值为 10,所以v1→v3的最短路径就是10 ,将v3加入到集合T中,T变为{v1,v3},
  3. 随着v3加入集合T中,数组dis会怎么变化呢?v3→v4为50,那么v1→v4可以通过v3中转v1→v3→v4=10+50=60,因为60 < dis[3],所以dis[3]=60,如图:
    《最短路径之Dijkstra算法Java实现》

  4. 重复步骤2,3,直到顶点全部加入到集合T中,

此题的Java代码实现
上面的集合T,在代码中用boolean[] visited表示

public class Dijkstra { public static void main(String[] args) { int[][] graph=new int[][]{{0,Integer.MAX_VALUE,10,Integer.MAX_VALUE,30,100}, {Integer.MAX_VALUE,0,5,Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE}, {Integer.MAX_VALUE,Integer.MAX_VALUE,0,50,Integer.MAX_VALUE,Integer.MAX_VALUE}, {Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE,0,Integer.MAX_VALUE,10}, {Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE,20,0,60}, {Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE,0}}; int[] dis=new int[6]; boolean[] visited=new boolean[6]; visited[0]=true; for(int i=0;i<6;i++) dis[i]=graph[0][i]; dijkstra(graph, dis, visited); for(int i=0;i<dis.length;i++) System.out.print(dis[i]+" "); } public static void dijkstra(int[][] graph,int[] dis,boolean[] visited){ while(true){ int min=Integer.MAX_VALUE; int index=-1; for(int i=0;i<dis.length;i++){ if(visited[i]) continue; else{ if(dis[i]<min){ index=i; min=dis[i]; } } } if(index==-1) break; visited[index]=true; for(int i=0;i<graph.length;i++){ if(graph[index][i]!=Integer.MAX_VALUE){ dis[i]=dis[i]<(min+graph[index][i])?dis[i]:min+graph[index][i]; } } } } }
    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/weixin_40423553/article/details/79613820
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞