Warshall算法和Floyd算法

2019-07-19  本文已影响0人  ZuYuan
    /**
     * Warshall算法
     * @param paths 布尔有向图矩阵
     * @param n 几阶矩阵
     * @return 传递闭包
     */
    public static boolean[][] warshall(boolean[][] paths, int n) {
        boolean beforePaths[][] = paths.clone();
        boolean nowPaths[][] = paths.clone();
        for (int k = 0; k < n; k++) {
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    //这里的k代替了c
                    nowPaths[i][j] = beforePaths[i][j] || beforePaths[i][k] && beforePaths[k][j];
                    beforePaths = nowPaths.clone();
                }
            }
        }
        return nowPaths;
    }

    /**
     * Floyd算法
     * @param paths 加权连通图
     * @param n 几阶矩阵
     * @return 表示任意两个点之间的最短路径的距离矩阵
     */
    public static int[][] floyd(int[][] paths, int n) {
        int[][] d = paths.clone();
        for (int k = 0; k < n;k++) {
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    d[i][j] = Math.min(d[i][j], d[i][k] + d[k][j]);
                }
            }
        }
        return d;
    }

上一篇下一篇

猜你喜欢

热点阅读