返回

掌握 Java 语言轻松解决 LeetCode 1737:Floyd Warshall 算法大展身手

见解分享

导言

图论在计算机科学领域有着广泛的应用,从社交网络分析到网络路由,无处不在。掌握图论算法对于解决实际问题至关重要。Floyd Warshall 算法就是图论中的一颗璀璨明珠,它可以高效地求解任意两点之间的最短路径。

Floyd Warshall 算法简介

Floyd Warshall 算法是一种动态规划算法,用于求解带权图中任意两点之间的最短路径。它的核心思想是逐个中转点进行松弛操作,逐步更新最短路径的距离。

Java 实现

import java.util.Arrays;

public class FloydWarshall {

    public static void main(String[] args) {
        // 输入数据,构建邻接矩阵
        int[][] graph = {
                {0, 10, 0, 0, 0},
                {10, 0, 1, 0, 0},
                {0, 1, 0, 10, 10},
                {0, 0, 10, 0, 0},
                {0, 0, 10, 0, 0}
        };

        // 初始化距离矩阵
        int[][] distances = new int[graph.length][graph.length];
        for (int i = 0; i < graph.length; i++) {
            Arrays.fill(distances[i], Integer.MAX_VALUE);
        }

        // 初始化最短路径经过的中间节点
        int[][] next = new int[graph.length][graph.length];
        for (int i = 0; i < graph.length; i++) {
            Arrays.fill(next[i], -1);
        }

        // Floyd Warshall 算法
        for (int k = 0; k < graph.length; k++) {
            for (int i = 0; i < graph.length; i++) {
                for (int j = 0; j < graph.length; j++) {
                    if (distances[i][j] > distances[i][k] + distances[k][j]) {
                        distances[i][j] = distances[i][k] + distances[k][j];
                        next[i][j] = k;
                    }
                }
            }
        }

        // 输出结果
        System.out.println("最短路径距离矩阵:");
        for (int[] row : distances) {
            System.out.println(Arrays.toString(row));
        }

        System.out.println("最短路径经过的中间节点矩阵:");
        for (int[] row : next) {
            System.out.println(Arrays.toString(row));
        }
    }
}

示例与分析

以上 Java 代码展示了如何使用 Floyd Warshall 算法求解 LeetCode 1737 的样例输入。样例输入是一个 5 个节点的无向带权图,节点之间的距离存储在邻接矩阵中。

算法执行后,distances 矩阵记录了任意两点之间的最短路径距离,next 矩阵则记录了最短路径经过的中间节点。

优势与局限

Floyd Warshall 算法的优势在于它可以一次性求出所有点对的最短路径,时间复杂度为 O(V^3),其中 V 是图中节点的数量。

然而,算法的局限性在于它只适用于带权非负的图。对于带权为负数的图,该算法将失效。

总结

通过深入了解 Floyd Warshall 算法的原理和 Java 实现,我们掌握了在实际场景中解决图论问题的一大利器。无论是社交网络分析、网络路由,还是 LeetCode 1737 这样的编程挑战,掌握这项算法都将让你游刃有余。