这两天因为朋友有点事,一直都很忙,没有更新文章,希望大家谅解。
继前天退出的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代码,所以写的原创,请勿乱喷!!!