最短路徑 Floyd算法

這兩天因爲朋友有點事,一直都很忙,沒有更新文章,希望大家諒解。
繼前天退出的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代碼,所以寫的原創,請勿亂噴!!!
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章