您的位置:首页 > 编程语言 > Java开发

最短路径之Dijkstra算法Java实现

2018-03-19 16:45 573 查看
Dijkstra算法步骤

以下图为例,求顶点v1到其他顶点的最短路径



初始化dis数组,怎么初始化呢?v1→v1设置为0,不能直接到达的设置为无穷大,能直接到达的附权值,并且定义集合T,初始化为{v1},集合T表示已经确定最短路径的顶点,结果如下:



找出dis数组中最小的值(不包括集合T中的顶点),这里最小值为 10,所以v1→v3的最短路径就是10 ,将v3加入到集合T中,T变为{v1,v3},

随着v3加入集合T中,数组dis会怎么变化呢?v3→v4为50,那么v1→v4可以通过v3中转v1→v3→v4=10+50=60,因为60 < dis[3],所以dis[3]=60,如图:



重复步骤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
4000
_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];
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: