图算法之Floyd-Warshall 算法(全点对最短路径)详细解读

Floyd-Warshall 算法是用于解决全点对最短路径问题的一种经典算法。该算法的目标是计算一个图中每一对顶点之间的最短路径,适用于加权图,并且可以处理有向图和无向图。与 Dijkstra 算法不同,Floyd-Warshall 算法可以处理负权边,但不允许图中存在负权环。

Floyd-Warshall 算法基本思想

Floyd-Warshall 算法通过动态规划的方式逐步改进顶点间的路径估计值,最终找到从任意一个顶点到另一个顶点的最短路径。其核心思想是,依次将每个顶点作为中间点,更新通过这个中间点的可能更短的路径。

关键思想

对于每一对顶点 ij,如果顶点 k 是一个中间顶点,那么路径 i -> j 的最短距离 dist[i][j] 可以通过比较以下两者来更新:

  1. 直接从 ij 的距离 dist[i][j]
  2. 通过顶点 k 作为中间点的路径,即 dist[i][k] + dist[k][j]

通过不断增加新的中间点,Floyd-Warshall 算法能够在三重循环的过程中更新每一对顶点之间的最短路径。

算法步骤

  1. 初始化

    • 使用邻接矩阵表示图,其中 dist[i][j] 表示从顶点 i 到顶点 j 的初始距离。如果 ij 之间没有边,则 dist[i][j] 设为 ∞(代表不可达);如果 i == j,则 dist[i][j] = 0(到自身的距离为 0)。
  2. 动态规划过程

    • 对于每个中间顶点 k,尝试通过顶点 k 来更新每对顶点 ij 之间的距离。如果 dist[i][k] + dist[k][j] < dist[i][j],则更新 dist[i][j]
  3. 重复更新

    • 遍历所有可能的中间顶点,最终得到每对顶点之间的最短路径。

伪代码

下面是 Floyd-Warshall 算法的伪代码:

for k from 1 to n: // k 是中间顶点for i from 1 to n: // i 是起点for j from 1 to n: // j 是终点if dist[i][j] > dist[i][k] + dist[k][j]:dist[i][j] = dist[i][k] + dist[k][j]

时间复杂度

  • 时间复杂度:Floyd-Warshall 算法的时间复杂度为 O(n3)O(n^3)O(n3),其中 nnn 是图中顶点的数量。由于该算法需要三重嵌套循环,效率相对较低,但适合处理密集图或当边数接近顶点数平方的情况下使用。

  • 空间复杂度:需要 O(n2)O(n^2)O(n2) 的空间来存储所有顶点之间的距离。

适用场景

Floyd-Warshall 算法适用于以下场景:

  • 当图中包含负权边时(但不能有负权环)。
  • 需要计算所有顶点对之间的最短路径时。
  • 图是密集图(顶点之间的边比较多)。

Java 实现

下面是 Floyd-Warshall 算法的 Java 实现:

import java.util.Arrays;public class FloydWarshallAlgorithm {// 定义一个常量表示无穷大(不可达)private static final int INF = 99999;// Floyd-Warshall 算法实现public static void floydWarshall(int[][] graph) {int numVertices = graph.length; // 顶点数量int[][] dist = new int[numVertices][numVertices];// 初始化距离数组for (int i = 0; i < numVertices; i++) {for (int j = 0; j < numVertices; j++) {dist[i][j] = graph[i][j];}}// 三重循环更新每一对顶点的最短路径for (int k = 0; k < numVertices; k++) {for (int i = 0; i < numVertices; i++) {for (int j = 0; j < numVertices; j++) {// 通过 k 更新 i 到 j 的最短路径if (dist[i][k] + dist[k][j] < dist[i][j]) {dist[i][j] = dist[i][k] + dist[k][j];}}}}// 打印最终的最短路径矩阵printSolution(dist);}// 打印最终的最短路径矩阵private static void printSolution(int[][] dist) {System.out.println("从各个顶点到其他顶点的最短距离矩阵:");for (int i = 0; i < dist.length; i++) {for (int j = 0; j < dist.length; j++) {if (dist[i][j] == INF) {System.out.print("INF ");} else {System.out.print(dist[i][j] + "   ");}}System.out.println();}}public static void main(String[] args) {// 示例图的邻接矩阵表示int[][] graph = {{0, 3, INF, INF},{2, 0, INF, 5},{INF, 1, 0, 2},{INF, INF, 3, 0}};// 执行 Floyd-Warshall 算法floydWarshall(graph);}
}

代码解读

  1. 输入

    • 使用一个二维数组 graph 表示图,其中 graph[i][j] 表示从顶点 i 到顶点 j 的边权值。如果顶点之间没有边,设为 INF 表示不可达。
  2. floydWarshall 方法

    • 初始化距离矩阵 dist 为邻接矩阵。
    • 三重循环遍历每个中间顶点 k,然后尝试更新 i -> j 之间的最短路径。
  3. 路径更新

    • 通过中间顶点 k,尝试更新 dist[i][j]。如果 dist[i][k] + dist[k][j] < dist[i][j],则更新为较小的值。
  4. 结果输出

    • 使用 printSolution 方法输出最终的最短路径矩阵,若某对顶点之间不可达,则输出 INF

测试数据

示例图的邻接矩阵为:

    0      3    INF    INF2      0    INF    5INF      1      0      2INF    INF      3      0

该矩阵表示:

  • 节点 0 到节点 1 的边权为 3,节点 1 到节点 0 的边权为 2。
  • 节点 1 到节点 3 的边权为 5,节点 2 到节点 3 的边权为 2,等等。

算法会最终计算出所有顶点对之间的最短路径。

输出结果

执行完 Floyd-Warshall 算法后,最终的最短路径矩阵如下:

0   3   4   6
2   0   3   5
3   1   0   2
5   3   3   0

负权边和负权环

  • 负权边:Floyd-Warshall 算法可以处理负权边,因为它在每一步中比较不同路径的权重并选择最小值。然而,它不能处理负权环(从某个顶点出发,经过一系列顶点又回到该顶点,且路径总权重为负)。
  • 负权环检测:在 Floyd-Warshall 算法执行结束后,若存在 dist[i][i] < 0 的情况,则说明图中存在负权环。

复杂度分析

  • 时间复杂度:由于 Floyd-Warshall 算法需要三重循环遍历所有顶点对和中间顶点,因此时间复杂度为 O(n3),适用于密集图。
  • 空间复杂度:需要存储一个 n×n 的距离矩阵,因此空间复杂度为 O(n2)。

总结

Floyd-Warshall 算法是求解全点对最短路径的经典算法,适用于需要处理负权边的场景。它的时间复杂度较高,因此适合处理顶点较少的密集图,而不是稀疏图。如果图中存在负权环,该算法可以用来检测。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/444267.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【拥抱AIGC】应该如何衡量AI辅助编程带来的收益

本文主要介绍了如何度量研发效能&#xff0c;以及AI辅助编程是如何影响效能的&#xff0c;进而阐述如何衡量AI辅助编程带来的收益。 理解度量&#xff1a;有效区分度量指标 为了帮助研发团队更好地理解和度量研发效能&#xff0c;可以将指标分为三类&#xff1a;能力和行为指…

【含文档】基于Springboot+Vue的母婴全程服务管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

vue3中 a-table设置某一个单元格的背景颜色

需求&#xff1a;根据某一个单元格中的某个条件不同&#xff0c;设置动态的颜色&#xff1b; 思路&#xff1a;通过官方文档提供的customCell进行判断设置不同的颜色背景&#xff0c;案例中进行了简单的行列判断&#xff0c;同学们可以根据自己的需求修改判断条件&#xff0c;动…

SSH 公钥认证:从gitlab clone项目repo到本地

这篇文章的分割线以下文字内容由 ChatGPT 生成&#xff08;我稍微做了一些文字上的调整和截图的补充&#xff09;&#xff0c;我review并实践后觉得内容没有什么问题&#xff0c;由此和大家分享。 假如你想通过 git clone git10.12.5.19:your_project.git 命令将 git 服务器上…

建筑工程系列中级职称申报有什么要求?

一、学历资历条件 1.理工类或建筑工程相关专业博士研究生毕业后&#xff0c;从事本专业技术工作&#xff0c;当年内经考核评审确认&#xff1b; 2.理工类或建筑工程相关专业硕士研究生毕业或取得双学士学位后&#xff0c;从事本专业技术工作 3 年以上&#xff0c;取得并被聘任…

【大模型理论篇】精简循环序列模型(minGRU/minLSTM)性能堪比Transformer以及对循环神经网络的回顾

1. 语言模型之精简RNN结构 近期关注到&#xff0c;Yoshua Bengio发布了一篇论文《Were RNNs All We Needed?》&#xff0c;提出简化版RNN&#xff08;minLSTM和minGRU&#xff09;。该工作的初始缘由&#xff1a;Transformer 在序列长度方面的扩展性限制重新引发了对可在训练期…

Vue包的安装使用

文章目录 vue介绍一、灵活易用1.渐进式框架2.简洁的语法 二、高效的响应式系统1.数据驱动2.响应式原理 三、强大的组件化开发1.组件化思想2.组件通信 四、丰富的生态系统1.插件和库2.社区支持 安装依赖删除新增文件夹components设置(1)home.vue(2)data.vue(3)zero.vue router配…

简单的maven nexus私服学习

简单的maven nexus私服学习 1.需求 我们现在使用的maven私服是之前同事搭建的&#xff0c;是在公司的一台windows电脑上面&#xff0c;如果出问题会比较难搞&#xff0c;所以现在想将私服迁移到我们公司的测试服务器上&#xff0c;此处简单了解一下私服的一些配置记录一下&am…

Visual Studio 2022安装(含重生版)

前言&#xff1a; 昨天调试代码的时候发现程序怎么都运行不了&#xff0c;错误显示无法找到文件啊啊啊&#xff0c;能力有限&#xff0c;找不出错误源&#xff0c;然后就狠心删掉所有相关文件来“重新开始”&#xff01; 正文&#xff1a; 1.官网下载&#xff08;内定中文版…

Java | Leetcode Java题解之第470题用Rand7()实现Rand10()

题目&#xff1a; 题解&#xff1a; class Solution extends SolBase {public int rand10() {int a, b, idx;while (true) {a rand7();b rand7();idx b (a - 1) * 7;if (idx < 40) {return 1 (idx - 1) % 10;}a idx - 40;b rand7();// get uniform dist from 1 - 63…

中标麒麟操作系统:如何查看系统激活状态

中标麒麟操作系统&#xff1a;如何查看系统激活状态 1、图形界面查看方法方法一&#xff1a;任务栏查看方法二&#xff1a;通过“我的电脑”属性查看 2、命令行查看方法 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 本文将介绍两种查看系…

java 的三种IO模型(BIO、NIO、AIO)

java 的三种IO模型&#xff08;BIO、NIO、AIO&#xff09; 一、BIO 阻塞式 IO&#xff08;Blocking IO&#xff09;1.1、BIO 工作机制1.2、BIO 实现单发单收1.3、BIO 实现多发多收1.4、BIO 实现客户端服务端多对一1.5、BIO 模式下的端口转发思想 二、NIO 同步非阻塞式 IO&#…

新款平行进口奔驰GLS450升级原厂AR实景导航人机交互行车记录仪等功能

平行进口的24款奔驰GLS450升级原厂中规导航主机通常具备以下功能&#xff1a; 人机交互系统&#xff1a;该导航主机配备了人机交互系统&#xff0c;可以通过触摸屏、旋钮或语音控制等方式与导航系统进行交互&#xff0c;方便驾驶者进行导航设置和操作。 实景AR导航&#xff1…

如何利用wsl-Ubuntu里conda用来给Windows的PyCharm开发

前提&#xff1a;咱们在wsl-Ubuntu上&#xff0c;有conda的虚拟环境 咱们直接打开PyCharm,打开Settings 更换Python Interpreter即可 当然一开始可能没有下面的选项&#xff0c;需要我们点击右边的Add Interpreter 这里选择wsl 点击next 将这两步进行修改 可以看出来&#xff0…

算法: 前缀和题目练习

文章目录 前缀和题目练习前缀和二维前缀和寻找数组的中心下标除自身以外数组的乘积和为 K 的子数组和可被 K 整除的子数组连续数组矩阵区域和 前缀和题目练习 前缀和 自己写出来了~ 坑: 数据太大,要用long. import java.util.Scanner;public class Main {public static voi…

【AIGC】寻找ChatGPT最佳推理步骤:CoT思维链技术的探索与应用

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;CoT思维链概述&#x1f4af;CoT思维链在大型语言模型中的应用&#x1f4af;CoT思维链改变对模型推理能力的理解和改进方式多样化应用场景挑战与未来发展总结 &#x1f4a…

网关在不同行业自动化生产线的应用

网关在不同行业自动化生产线的应用&#xff0c;展示了其作为信息与物理世界交汇点的广泛影响力&#xff0c;尤其在推动行业智能化、自动化方面发挥了不可估量的作用。以下是网关技术在污水处理、智慧农业、智慧工厂、电力改造及自动化控制等领域的深入应用剖析。 1. 污水处理 …

初级网络工程师之从入门到入狱(五)

本文是我在学习过程中记录学习的点点滴滴&#xff0c;目的是为了学完之后巩固一下顺便也和大家分享一下&#xff0c;日后忘记了也可以方便快速的复习。 网络工程师从入门到入狱 前言一、链路聚合1.1、手动进行链路聚合1.1.1、 拓扑图&#xff1a;1.1.2、 LSW11.1.3、 LSW2 1.2、…

智谱开放平台API调用解析

一、什么是智谱AI 智谱AI成立于2019年&#xff0c;由‌清华大学计算机系知识工程实验室的技术成果转化而来&#xff0c;是一家致力于人工智能技术研发和应用的公司。智谱致力于打造新一代认知智能大模型&#xff0c;专注于做大模型的中国创新。 二、智谱开放平台API调用 官方文…

十、kotlin的协程

协程 基本概念定义组成挂起和恢复结构化并发协程构建器作用域构建器挂起函数阻塞与非阻塞runBlocking全局协程像守护线程 Job的生命周期 常用函数延时和等待启动和取消启动取消 暂停 协程启动调度器启动方式启动模式线程上下文继承的定义继承的公式 协程取消与超时取消挂起点取…