迪杰斯特拉算法求最短路径问题(java实现)
算法思想:先定义一个二维数组将每个顶点到其余直接相连顶点的距离保存起来,若没有直接相连,则用Integer.MAX_VALUE(int类型的最大值)代替,再定义两个一位数组distance[],previous[],distance用来保存某个顶点到其余顶点的最短距离,previous则保存其余顶点的前驱顶点的下标,通过主次比较筛选出最短路径。
代码实现:
public class ShortestPath {
private static int max = Integer.MAX_VALUE;
private static int[] dist = new int[6];
private static int[] prev = new int[6];
private static int a[][]={
{0,max,10,max,30,100},
{max,0,5,max,max,max},
{max,max,0,50,max,max},
{max,max,max,0,max,10},
{max,max,max,20,0,60},
{max,max,max,max,max,0}
};
public static void main(String[] args) {
// TODO Auto-generated method stub
ShortestPath shortestPath = new ShortestPath();
shortestPath.dijkstra(0, a, dist, prev);
System.out.print("顶点0到其余顶点的最短路径是:");
for(int i = 0;i < dist.length;i++){
System.out.print(dist[i]+" ");
}
//System.out.println("hehe");
}
/**
* 迪杰斯特拉算法
*/
public void dijkstra(int v,int[][] a,int[] dist,int[] prev){
int n = dist.length - 1;
boolean[] s = new boolean[n+1];//判断该顶点是否找到了最短路径
for(int i = 1;i <= n;i++){
//初始化dist数组
dist[i] = a[v][i];
s[i] = false;
if(dist[i] < max){
prev[i] = v;
}else{
prev[i] = -1;
}
}
dist[v] = 0;
s[v] = true;
for(int i = 1;i <= n;i++){
int temp = Integer.MAX_VALUE;//temp暂存v到其余定点的最短距离
int u = v;
for(int j = 1;j <= n;j++){
if((!s[j]) && dist[j] < temp){//如果该顶点不属于s顶点集并且该顶点有前驱顶点
u = j;//更新当前源顶点,将
temp = dist[j];//更新当前最短路径
}
}
s[u] = true;
for(int j = 0;j <= n;j++){
if((!s[j]) &&a[u][j] < max){
int newDist = dist[u] + a[u][j];
if(newDist < dist[j]){
dist[j] = newDist;
prev[j] = u;
}
}
}
}
}
}