無向圖的Dijkstra演算法(求任意一對頂點間的最短路徑)迪傑斯特拉演算法
阿新 • • 發佈:2018-12-24
public class Main{
public static int dijkstra(int[][] w1,int start,int end) {
boolean[] isLable = new boolean[w1[0].length];//是否標上所有的號
int[] indexs = new int[w1[0].length];//所有標號的下標集合,以標號的先後順序進行儲存。實際上是一個棧
int i_count = -1; //棧的頂點
int[] distance = w1[start].clone();//以v0到各點的最短距離的初始值
int index = start;//從初始點開始
int presentShortest = 0; //當前臨時最短距離
indexs[++i_count] = index; //把已經標號的下標存入下標集中
isLable[index] = true;
while(i_count<w1[0].length) {
//第一步:標號v0,即w[0][0]找到距離v0最近的點
int min = Integer.MAX_VALUE;
for(int i=0;i<distance.length;i++) {
if(!isLable[i]&&distance[ i]!=-1&&i!=index) {
//如果到這個點有邊,並且沒有被標號
if(distance[i]<min) {
min = distance[i];
index = i;//把下標改為當前下標
}
}
}
if(index == end) {//已經找到當前點了,就結束程式
break;
}
isLable[index]=true; //對點進行標號
indexs[++i_count] = index; //把已經標號的下標存入下標集中,入棧
if(w1[indexs[ i_count-1]][index]==-1||presentShortest+w1[indexs[i_count-1]][index]>distance[index]) {
//如果兩個點沒有直接相連,或兩個點路徑大於最短路徑
presentShortest = distance[index];
}else {
presentShortest+=w1[indexs[i_count-1]][index];
}
//第二步:將distance中距離加入vi
for(int i=0;i<distance.length;i++) {
//如果vi到那個點有邊,則v0到後面點距離增加
if(distance[i]==-1&&w1[index][i]!=-1) {//如果以前不可達,則現在可達了
distance[i]=presentShortest+w1[index][i];
}else if(w1[index][i]!=-1&&presentShortest+w1[index][i]<distance[i]) {
//如果以前可達,但現在的路徑比以前更短,則更換成更短路徑
distance[i] = presentShortest+w1[index][i];
}
}
}
return distance[end]-distance[start];
}
public static void main(String[] args) {
}
}