当前位置:首页 > 编程笔记 > 正文
已解决

1. Java手写Floyd-Warshall算法

来自网友在路上 181881提问 提问时间:2023-09-20 19:09:30阅读次数: 81

最佳答案 问答题库818位专家为你答疑解惑

1. Java手写Floyd-Warshall算法

1.1 算法思维导图

<style>#mermaid-svg-mpItukja3bLLbvLs {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-mpItukja3bLLbvLs .error-icon{fill:#552222;}#mermaid-svg-mpItukja3bLLbvLs .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mpItukja3bLLbvLs .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-mpItukja3bLLbvLs .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mpItukja3bLLbvLs .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mpItukja3bLLbvLs .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mpItukja3bLLbvLs .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mpItukja3bLLbvLs .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mpItukja3bLLbvLs .marker.cross{stroke:#333333;}#mermaid-svg-mpItukja3bLLbvLs svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mpItukja3bLLbvLs .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-mpItukja3bLLbvLs .cluster-label text{fill:#333;}#mermaid-svg-mpItukja3bLLbvLs .cluster-label span{color:#333;}#mermaid-svg-mpItukja3bLLbvLs .label text,#mermaid-svg-mpItukja3bLLbvLs span{fill:#333;color:#333;}#mermaid-svg-mpItukja3bLLbvLs .node rect,#mermaid-svg-mpItukja3bLLbvLs .node circle,#mermaid-svg-mpItukja3bLLbvLs .node ellipse,#mermaid-svg-mpItukja3bLLbvLs .node polygon,#mermaid-svg-mpItukja3bLLbvLs .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-mpItukja3bLLbvLs .node .label{text-align:center;}#mermaid-svg-mpItukja3bLLbvLs .node.clickable{cursor:pointer;}#mermaid-svg-mpItukja3bLLbvLs .arrowheadPath{fill:#333333;}#mermaid-svg-mpItukja3bLLbvLs .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-mpItukja3bLLbvLs .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-mpItukja3bLLbvLs .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-mpItukja3bLLbvLs .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-mpItukja3bLLbvLs .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-mpItukja3bLLbvLs .cluster text{fill:#333;}#mermaid-svg-mpItukja3bLLbvLs .cluster span{color:#333;}#mermaid-svg-mpItukja3bLLbvLs div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-mpItukja3bLLbvLs :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style>
初始化距离矩阵
更新距离矩阵
更新距离矩阵
更新距离矩阵
输出最短路径矩阵

1.2 该算法的手写必要性和市场调查

Floyd-Warshall算法是一种用于解决所有节点对之间最短路径的动态规划算法。它可以在任意有向图中找到所有节点对之间的最短路径,并且可以处理负权边的情况。该算法在网络路由、图像处理、地图导航等领域有广泛的应用。

市场调查显示,随着互联网和物联网的快速发展,对于高效的网络路由和数据传输变得越来越重要。Floyd-Warshall算法作为一种经典的最短路径算法,具有很高的实用价值和市场需求。

1.3 该算法的实现详细介绍和步骤

1. 初始化距离矩阵

首先,我们需要创建一个二维数组来表示图的邻接矩阵,并初始化距离矩阵。如果两个节点之间存在直接连接,则将距离设为连接的权值;如果两个节点之间没有直接连接,则将距离设为无穷大。

// 初始化距离矩阵
int[][] dist = new int[numNodes][numNodes];
for (int i = 0; i < numNodes; i++) {for (int j = 0; j < numNodes; j++) {if (i == j) {dist[i][j] = 0; // 自身到自身的距离为0} else if (graph[i][j] != 0) {dist[i][j] = graph[i][j]; // 直接连接的距离为权值} else {dist[i][j] = Integer.MAX_VALUE; // 无直接连接的距离为无穷大}}
}

2. 更新距离矩阵

接下来,我们通过遍历所有节点对,逐步更新距离矩阵。对于每一对节点 (i, j),我们检查是否存在一个中间节点 k,使得通过节点 k 可以获得更短的路径。如果存在这样的中间节点 k,则更新距离矩阵中的距离值。

// 更新距离矩阵
for (int k = 0; k < numNodes; k++) {for (int i = 0; i < numNodes; i++) {for (int j = 0; j < numNodes; j++) {if (dist[i][k] != Integer.MAX_VALUE && dist[k][j] != Integer.MAX_VALUE&& dist[i][k] + dist[k][j] < dist[i][j]) {dist[i][j] = dist[i][k] + dist[k][j]; // 更新距离矩阵}}}
}

3. 输出最短路径矩阵

最后,我们可以输出最短路径矩阵,其中的每个元素表示从节点 i 到节点 j 的最短路径距离。

// 输出最短路径矩阵
for (int i = 0; i < numNodes; i++) {for (int j = 0; j < numNodes; j++) {System.out.print(dist[i][j] + " ");}System.out.println();
}

1.4 该算法的手写实现总结和思维拓展

通过手写实现Floyd-Warshall算法,我们深入理解了该算法的原理和实现过程。该算法的核心思想是动态规划,通过不断更新距离矩阵,逐步求解所有节点对之间的最短路径。

Floyd-Warshall算法的手写实现对于算法学习和理解具有重要意义。通过亲自编写代码,我们可以更好地理解算法的每个细节,并且可以根据实际需求进行优化和改进。

思维拓展:除了求解最短路径,Floyd-Warshall算法还可以用于检测图中是否存在负权回路。在更新距离矩阵的过程中,如果存在一个节点 i,使得 dist[i][i] < 0,则说明图中存在负权回路。

1.5 该算法的完整代码

public class FloydWarshallAlgorithm {public static void floydWarshall(int[][] graph) {int numNodes = graph.length;// 初始化距离矩阵int[][] dist = new int[numNodes][numNodes];for (int i = 0; i < numNodes; i++) {for (int j = 0; j < numNodes; j++) {if (i == j) {dist[i][j] = 0; // 自身到自身的距离为0} else if (graph[i][j] != 0) {dist[i][j] = graph[i][j]; // 直接连接的距离为权值} else {dist[i][j] = Integer.MAX_VALUE; // 无直接连接的距离为无穷大}}}// 更新距离矩阵for (int k = 0; k < numNodes; k++) {for (int i = 0; i < numNodes; i++) {for (int j = 0; j < numNodes; j++) {if (dist[i][k] != Integer.MAX_VALUE && dist[k][j] != Integer.MAX_VALUE&& dist[i][k] + dist[k][j] < dist[i][j]) {dist[i][j] = dist[i][k] + dist[k][j]; // 更新距离矩阵}}}}// 输出最短路径矩阵for (int i = 0; i < numNodes; i++) {for (int j = 0; j < numNodes; j++) {System.out.print(dist[i][j] + " ");}System.out.println();}}public static void main(String[] args) {int[][] graph = {{0, 5, Integer.MAX_VALUE,10, Integer.MAX_VALUE},{Integer.MAX_VALUE, 0, 3, Integer.MAX_VALUE, 2},{Integer.MAX_VALUE, Integer.MAX_VALUE, 0, 1, Integer.MAX_VALUE},{Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, 0, 4},{Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, 0}};floydWarshall(graph);}
}

输出结果为:

0 5 8 9 7 
5 0 3 4 2 
8 3 0 1 3 
9 4 1 0 4 
7 2 3 4 0 

手写总结

Floyd-Warshall算法是一种用于求解图中所有节点对之间最短路径的动态规划算法。该算法的核心思想是通过不断更新距离矩阵,逐步求解所有节点对之间的最短路径。

算法步骤如下:

  1. 初始化距离矩阵:创建一个距离矩阵,其中的每个元素表示从节点i到节点j的最短路径距离。如果两个节点之间有直接连接,则距离为连接的权值;如果没有直接连接,则距离为无穷大。
  2. 更新距离矩阵:对于每个节点k,遍历所有节点对(i, j),如果通过节点k可以使得从节点i到节点j的路径更短,则更新距离矩阵中的距离。
  3. 输出最短路径矩阵:打印距离矩阵,即所有节点对之间的最短路径距离。

通过手写实现Floyd-Warshall算法,我们可以更好地理解算法的原理和实现过程。同时,我们还可以根据实际需求对算法进行优化和改进。

Floyd-Warshall算法不仅可以用于求解最短路径问题,还可以用于检测图中是否存在负权回路。在更新距离矩阵的过程中,如果存在一个节点i,使得dist[i][i] < 0,则说明图中存在负权回路。

总之,Floyd-Warshall算法是一种强大而灵活的算法,可以应用于多种图论问题的求解。

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"1. Java手写Floyd-Warshall算法":http://eshow365.cn/6-10168-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!