繼前天退出的Dijkstra算法後,在其基礎上,我們來進行Floyd代碼的分享。
代碼程序:
package org.tree;
public class FloydArithmetic {
private static final int INFINITE = 9999;
public static int[][] Pathmatirx;
public static int[][] shortPathTable ;
public static void floydArithmetic(int[][] matrix,int vertexsSize){
// 構建一個用於保存所有點最短路徑的下表存儲數組
Pathmatirx = new int[vertexsSize][vertexsSize];
// 構建一個用於保存點與點之間的對端路徑存儲數組
shortPathTable = new int[vertexsSize][vertexsSize];
// 初始化我們定義的兩個數組
for (int i = 0; i < vertexsSize; i++) {
for (int j = 0; j < vertexsSize; j++) {
if(i == j){
shortPathTable[i][j] = 0;
}else{
shortPathTable[i][j] = matrix[i][j];
}
Pathmatirx[i][j] = j;
}
}
// Floyd算法原理 D[j][k] = min(D[j][k],D[j][i]+d[i][k])
for (int i = 0; i < vertexsSize; i++) {
for (int j = 0; j < vertexsSize; j++) {
for (int k = 0; k < vertexsSize; k++) {
if(shortPathTable[j][k] > shortPathTable[j][i] + shortPathTable[i][k]){
shortPathTable[j][k] = shortPathTable[j][i] + shortPathTable[i][k];
Pathmatirx[j][k] = Pathmatirx[j][i];
}
}
}
}
}
/**
* 打印點與點之間的最短路徑
* @param vertex1
* @param vertex2
* @param Pathmatirx
*/
private static void printShortPath(int vertex1,int vertex2,int[][] Pathmatirx){
System.out.print("路徑爲: "+vertex1);
while (vertex1 != vertex2) {
vertex1 = Pathmatirx[vertex1][vertex2];
System.out.print(" ------> "+vertex1);
}
System.out.println();
}
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 ;
floydArithmetic(matrix,5);
for (int i = 0; i < shortPathTable.length; i++) {
for (int j = 0; j < shortPathTable[i].length; j++) {
System.out.println("點"+i+"到點"+j+"最短距離 "+shortPathTable[i][j]);
printShortPath(i,j,Pathmatirx);
}
}
}
}
網上這種算法講解很多,而且很容易被大家理解,我僅僅在註釋上給大家略講了下。希望各位飯友學習愉快。如有錯誤,歡迎指教!!
注意:此算法是我在書上看到的,我僅僅只是將原來的C代碼翻譯成java代碼,所以寫的原創,請勿亂噴!!!