public class Dijk {
public static void dijkstra(int v,int[][] f,int[] d,int[] pre) {
int n = d.length-1;
boolean[] s = new boolean[n+1];
for(int j=1;j<=n;j++) {
d[j] = f[v][j];
s[j] = false;
if(d[j] == Integer.MAX_VALUE)
pre[j] = 0;
else
pre[j] = v;
}
s[v] = true;
d[v] = 0;
int u = v;
int min;
for(int i=1;i<n;i++) {
min = Integer.MAX_VALUE;
for(int j=1;j<=n;j++) {
if((!s[j])&&min > d[j]) {
min = d[j];
u = j;
}
}
s[u] = true;
for(int j=1;j<=n;j++) {
if ((!s[j]) && (f[u][j] < Integer.MAX_VALUE)) {
int newdist = d[u] + f[u][j];
if (newdist < d[j]) {
d[j] = newdist;
pre[j] = u;
}
}
}
}
}
public static void trace(int[] pres, int pre) {
if(pre ==1) {
System.out.print(1);
return;
}
if(pre ==0){
System.out.println("不可達");
return;
}
trace(pres,pres[pre]);
System.out.print(" " + pre);
}
public static void main(String[] args) {
int max = Integer.MAX_VALUE;
//有線圖各頂點之間的距離權重,max爲不可達
int[][] a = {
{ max, max, max, max, max, max, max},
{ max, 0 , 3 , 4 , max, max, max},
{ max, max, 0 , 1 , 9 , 4 , max},
{ max, max, max, 0 , 5 , 13 , max},
{ max, max, max, max,0 , max, 8 },
{ max, max, max, max, 12 , 0 , 10 },
{ max, max, max, max, max, max, 0 }
};
int n = a.length;
//最短距離
int[] dist = new int[n];
//距離上個頂點
int[] prev = new int[n];
dijkstra(1, a, dist, prev);
System.out.print(" 頂點1到2的最短路徑: ");
trace(prev, 2);
System.out.println();
System.out.print(" 頂點1到3的最短路徑: ");
trace(prev, 3);
System.out.println();
System.out.print(" 頂點1到4的最短路徑: ");
trace(prev, 4);
System.out.println();
System.out.print(" 頂點1到5的最短路徑: ");
trace(prev, 5);
System.out.println();
System.out.print(" 頂點1到6的最短路徑: ");
trace(prev, 6);
}
}
Dijkstra算法求最短路徑
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.