1. 程式人生 > >無向圖的Dijkstra演算法(求任意一對頂點間的最短路徑)迪傑斯特拉演算法

無向圖的Dijkstra演算法(求任意一對頂點間的最短路徑)迪傑斯特拉演算法

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) { } }