代碼如下:
package org.tree;
import java.util.Arrays;
public class DijkstraArithmetic {
private static final int INFINITE = 9999;
public static int[] Pathmatirx ;
public static int[] shortPathTable ;
public static void shortestPathDijkstra(int[][] matirx, int head, int vertexsSize){
Pathmatirx = new int[vertexsSize]; // 用於存儲最短路徑下標的數組
shortPathTable = new int[vertexsSize]; // 用於存儲到各點最短路徑的權值和
int[] flags = new int[vertexsSize];
// 得到該頂點的所有的權
for (int i = 0; i < vertexsSize; i++) {
shortPathTable[i] = matirx[head][i];
}
// 初始化
flags[head] = 1; // head頂點到head頂點不需要求路徑
shortPathTable[head] = 0; // head頂點到head頂點爲0
for (int i = 1; i < vertexsSize; i++) {
int min = INFINITE;
int minValueIndex = Integer.MAX_VALUE;
// 找到最小的路徑,並通過minValueIndex參數標識
for (int j = 0; j < vertexsSize; j++) {
if(flags[j] != 1 && shortPathTable[j] < min){
min = shortPathTable[j];
minValueIndex = j;
}
}
// 將目前找到最近的頂點置爲1
flags[minValueIndex] = 1;
// 修正當前最短路徑及距離
for (int j = 0; j < vertexsSize; j++) {
if( flags[j] != 1 && (min+matirx[minValueIndex][j] < shortPathTable[j])){
// 以下說明有更短的路徑存在,修改shortPathTable和Pathmatirx
shortPathTable[j] = min+matirx[minValueIndex][j];
Pathmatirx[j] = minValueIndex;
}
}
}
}
public static void main(String[] args) {
int[][] matrix = new int[5][5];
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix.length; j++) {
matrix[i][j] = INFINITE;
}
}
matrix[0][1] = 10 ;
matrix[1][0] = 10 ;
matrix[1][3] = 13 ;
matrix[3][1] = 13 ;
matrix[0][4] = 7 ;
matrix[4][0] = 7 ;
matrix[0][2] = 3 ;
matrix[2][0] = 3 ;
matrix[3][4] = 5 ;
matrix[4][3] = 5;
matrix[2][4] = 2 ;
matrix[4][2] = 2 ;
shortestPathDijkstra(matrix,3,5);
// 以下是 頂點 matrix[3] 到各個頂點的短距離
for (int c = 0; c < 5; c++) {
System.out.println("頂點3到頂點"+c+"的最短距離是"+shortPathTable[c]);
}
}
}
注意:此算法是我在書上看到的,我僅僅只是將原來的C代碼翻譯成java代碼,所以寫的原創,請勿亂噴,希望大家學習開心!!!
(時間原因,這裏我就不解釋了,網上有資料的)