程序员必会十大算法之弗洛伊德算法

Posted 独饮敌敌畏丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序员必会十大算法之弗洛伊德算法相关的知识,希望对你有一定的参考价值。

学习资料

迪杰斯特拉计算的是单源最短路径,而弗洛伊德计算的是多源最短路径

代码

public class Main {
    //不能设置为Integer.MAX_VALUE,否则两个Integer.MAX_VALUE相加会溢出导致出现负权
    public static int MaxValue = 10000;
    public static int[][] path;

    public static void main(String[] args) {
        //创建顶点和边
        char[] data = {'A','B','C','D','E','F','G'};
        int[][] matrix = {
                {10000,5,7,10000,10000,10000,2},
                {5,10000,10000,9,10000, 10000,3},
                {7,10000,10000,10000,8,10000,10000},
                {10000,9,10000,10000,10000,4,10000},
                {10000,10000,8,10006,10000,5,4},
                {10000,10000,10000,4,5,10000,6},
                {2,3,10000,10000,4,6,10000}};
        //初始化路径数组
        path = new int[matrix.length][matrix.length];

        floyd(matrix);
    }

    //非递归实现
    public static void floyd(int[][] matrix) {
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix.length; j++) {
                path[i][j] = -1;
            }
        }

        for (int m = 0; m < matrix.length; m++) {
            for (int i = 0; i < matrix.length; i++) {
                for (int j = 0; j < matrix.length; j++) {
                    if (matrix[i][m] + matrix[m][j] < matrix[i][j]) {
                        matrix[i][j] = matrix[i][m] + matrix[m][j];
                        //记录经由哪个点到达
                        path[i][j] = m;
                    }
                }
            }
        }

        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix.length; j++) {
                if (i != j) {
                    if (matrix[i][j] == MaxValue) {
                        System.out.println(i + "到" + j + "不可达");
                    } else {
                        System.out.print(i + "到" + j + "的最短路径长度是:" + matrix[i][j]);
                        System.out.print("最短路径为:" + i + "->");
                        findPath(i, j);
                        System.out.println(j);
                    }
                }
            }
        }
    }

    //递归寻找路径
    public static void findPath(int i, int j) {
        int m = path[i][j];
        if (m == -1) {
            return;
        }

        findPath(i, m);
        System.out.print(m + "->");
        findPath(m, j);
    }
}

结果

01的最短路径长度是:5最短路径为:0->1
02的最短路径长度是:7最短路径为:0->2
03的最短路径长度是:12最短路径为:0->6->5->3
04的最短路径长度是:6最短路径为:0->6->4
05的最短路径长度是:8最短路径为:0->6->5
06的最短路径长度是:2最短路径为:0->6
10的最短路径长度是:5最短路径为:1->0
12的最短路径长度是:12最短路径为:1->0->2
13的最短路径长度是:9最短路径为:1->3
14的最短路径长度是:7最短路径为:1->6->4
15的最短路径长度是:9最短路径为:1->6->5
16的最短路径长度是:3最短路径为:1->6
20的最短路径长度是:7最短路径为:2->0
21的最短路径长度是:12最短路径为:2->0->1
23的最短路径长度是:17最短路径为:2->4->5->3
24的最短路径长度是:8最短路径为:2->4
25的最短路径长度是:13最短路径为:2->4->5
26的最短路径长度是:9最短路径为:2->0->6
30的最短路径长度是:12最短路径为:3->5->6->0
31的最短路径长度是:9最短路径为:3->1
32的最短路径长度是:17最短路径为:3->5->4->2
34的最短路径长度是:9最短路径为:3->5->4
35的最短路径长度是:4最短路径为:3->5
36的最短路径长度是:10最短路径为:3->5->6
40的最短路径长度是:6最短路径为:4->6->0
41的最短路径长度是:7最短路径为:4->6->1
42的最短路径长度是:8最短路径为:4->2
43的最短路径长度是:9最短路径为:4->5->3
45的最短路径长度是:5最短路径为:4->5
46的最短路径长度是:4最短路径为:4->6
50的最短路径长度是:8最短路径为:5->6->0
51的最短路径长度是:9最短路径为:5->6->1
52的最短路径长度是:13最短路径为:5->4->2
53的最短路径长度是:4最短路径为:5->3
54的最短路径长度是:5最短路径为:5->4
56的最短路径长度是:6最短路径为:5->6
60的最短路径长度是:2最短路径为:6->0
61的最短路径长度是:3最短路径为:6->1
62的最短路径长度是:9最短路径为:6->0->2
63的最短路径长度是:10最短路径为:6->5->3
64的最短路径长度是:4最短路径为:6->4
65的最短路径长度是:6最短路径为:6->5

以上是关于程序员必会十大算法之弗洛伊德算法的主要内容,如果未能解决你的问题,请参考以下文章

程序员必会十大算法之Prim算法

程序员必会十大算法之Kruskal算法

程序员必会十大算法之骑士周游问题

常用的十大算法-弗洛伊德算法

十大排序算法(程序员必会)

程序员常用 10 种算法之弗洛伊德算法