数据结构与算法之Floyd弗洛伊德算法求最短路径

目录

前言

Floyd弗洛伊德算法

定义

步骤

一、初始化

二、添加中间点

三、迭代

四、得出结果

时间复杂度

代码实现

结束语


前言

今天是坚持写博客的第18天,希望可以继续坚持在写博客的路上走下去。我们今天来看看数据结构与算法当中的弗洛伊德算法。


Floyd弗洛伊德算法

定义

Floyd弗洛伊德算法是一种用于在加权图中找到所有顶点对之间的最短路径的算法。这个算法可以处理带有正权、负权甚至零权(但不存在负权环路)的图。

对于了解Floyd弗洛伊德算法,我们需要先了解几个前置概念:

  1. 加权图:图中的每条边都有一个与之关联的权值
  2. 最短路径:从一个顶点到另一个顶点的总权值最小的路径
  3. 负权环路:一个环路(即一条起点和终点相同的路径),其所有边的权值之和为负。如果存在负权环路,则最短路径问题可能没有解,因为可以通过无限次地遍历这个环路来不断减小路径的总权值。

步骤

假设我们有如下的图:

其中A到B的权值为2,A到C的权值为6,A到D的权值为5,B到C的权值为1,B到D的权值为4,C到D的权值为3。我们可以先得出他的邻接矩阵:

为什么对角线上的值都是零?因为对角线上的路径都是一个环路,图上没有自己指向自己的环路,因此都是0

下面进入正题,如何使用弗洛伊德算法呢?

一、初始化

首先,为图中所有顶点对(i, j)之间设置一个距离矩阵D,其中D[i][j]表示从顶点i到顶点j的当前已知最短距离。如果两个顶点之间没有直接相连的边,则设置D[i][j]为一个很大的数(通常是一个无穷大的值,表示为∞)。如果两个顶点之间有直接相连的边,则设置D[i][j]为该边的权值。另外,设置一个中间矩阵P,用于记录最短路径的信息

二、添加中间点

  1. 对于图中的每一个顶点k(作为中间点),遍历所有顶点对(i, j)(其中i和j是图中的顶点且i ≠ j,i ≠ k,j ≠ k)。
  2. 如果从i到k再到j的路径比已知的i到j的路径更短(即dist[i][k] + dist[k][j] < dist[i][j]),则更新dist[i][j]为dist[i][k] + dist[k][j]。

三、迭代

重复步骤二,对于图中的每一个顶点k都执行一次。由于图中总共有n个顶点,因此这个步骤需要执行n次迭代。

四、得出结果

在完成所有迭代后,dist矩阵将包含图中所有顶点对之间的最短路径长度。如果dist[i][j]的值仍然是无穷大,则表示从顶点i到顶点j没有路径


时间复杂度

Floyd算法的时间复杂度为O(n^3),其中n是图中顶点的数量。这是因为算法需要进行n次迭代,每次迭代都需要检查所有n^2个顶点对。 


代码实现

下面是大家期待的代码实现,今天我们用python实现

import numpy as np  def floyd_warshall(graph):  n = len(graph)  # 复制邻接矩阵作为距离矩阵  dist = np.copy(graph)  # 遍历所有顶点作为中间点  for k in range(n):  # 遍历所有顶点对 (i, j)  for i in range(n):  for j in range(n):  # 如果通过顶点 k 可以找到更短的路径  if dist[i][k] + dist[k][j] < dist[i][j]:  dist[i][j] = dist[i][k] + dist[k][j]  return dist  # 示例图(邻接矩阵)  
graph = np.array([  [0, 5, float('inf'), 10],  [float('inf'), 0, 3, float('inf')],  [float('inf'), float('inf'), 0, 1],  [float('inf'), float('inf'), float('inf'), 0]  
])  # 调用 Floyd-Warshall 算法  
distances = floyd_warshall(graph)  # 打印结果  
print("Shortest distances between all pairs of vertices:")  
print(distances)

结束语

以上就是今天对弗洛伊德算法求解最短路径的解释,希望对大家有所帮助,如果对您有帮助,希望您可以留下一个点赞、关注和收藏,这对我很重要,谢谢!

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

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

相关文章

Leetcode3164. 优质数对的总数 II

Every day a Leetcode 题目来源&#xff1a;3164. 优质数对的总数 II 解法1&#xff1a;统计因子 遍历 nums1&#xff0c;统计所有元素的因子个数&#xff0c;记录到哈希表 cnt 中。 遍历 nums2&#xff0c;那么有 cnt[nums2[i]*k] 个数可以被 nums2[i]*k 整除&#xff0c;…

利用conda进行R的安装

1.miniconda3的安装 官网&#xff1a;Miniconda — Conda documentation 找到对应系统、Python版本下载 wget https://mirrors.ustc.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh #wget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x…

信息系统项目管理师0141:产品范围和项目范围(9项目范围管理—9.1管理基础—9.1.1产品范围和项目范围)

点击查看专栏目录 文章目录 第9章 项目范围管理9.1 管理基础9.1.1 产品范围和项目范围 第9章 项目范围管理 项目范围管理包括确保项目做且只做所需的全部工作&#xff0c;以成功完成项目。项目范围管理主要在于定义和控制哪些工作应该包括在项目内&#xff0c;哪些不应该包含在…

Spring运维之boot项目开发关键之日志操作以及用文件记录日志

日志基础 日志 在企业级开发中还是比较重要的 我们来写一个日志 RestController RequestMapping("/books") public class Controller {//创建记录日志的对象private static final Logger log LoggerFactory.getLogger(Controller.class);GetMappingpublic String …

java自学阶段二:JavaWeb开发60(mybatis学习)

目录&#xff1a; 学习目标mybatis的基础用法&#xff08;新增、删除、修改、查询&#xff09; 一&#xff1a;学习目标&#xff1a; 1&#xff09;了解mybatis的基础概念&#xff1b; 2&#xff09;学会mybatis的基础用法&#xff1b; 二、mybatis的基础概念&#xff1a; M…

在Cisco Packet Tracer上配置NAT

目录 前言一、搭建网络拓扑1.1 配置PC机1.2 配置客户路由器1.3 配置ISP路由器 二、配置NAT2.1 在客户路由器中配置NAT2.2 测试是否配置成功 总结 前言 本篇文章是在了解NAT的原理基础上&#xff0c;通过使用Cisco Packet Tracer 网络模拟器实现模拟对NAT的配置&#xff0c;以加…

C++ | Leetcode C++题解之第132题分割回文串II

题目&#xff1a; 题解&#xff1a; class Solution { public:int minCut(string s) {int n s.size();vector<vector<int>> g(n, vector<int>(n, true));for (int i n - 1; i > 0; --i) {for (int j i 1; j < n; j) {g[i][j] (s[i] s[j]) &…

Jenkins+Rancher2.7部署构建

在Jenkins中使用rancher插件时需要去查找工作负载地址 在Rancher2.7没有查看Api按钮了需要自己去查找 1.进入https://192.168.x.xx:6443/v3/projects/ 2.输入在rancher中要查找的的项目名称并点击deployment连接进入下一个页面 3.找到自己的deployment随便点一个进去 4.浏览…

Nginx设置缓存后,访问网页404 问题原因及解决方案(随手记)

目录 问题描述Nginx文件 解决方案查看error_log日志问题原因修改文件并测试Nginx文件测试 总结 问题描述 在Nginx中设置缓存expires后&#xff0c;结果重启nginx&#xff0c;网站访问404了。 Nginx文件 server {listen 80;server_name bird.test.com;location / {root /app/…

Echarts 在指定部分做文字标记

文章目录 需求分析1. demo12. demo22. demo3 定位解决需求 实现在Echarts的折线图中,相同Y值的两点之间显示’abc’ 分析 1. demo1 使用 ECharts 的 markLine 功能来在相邻两个点之间添加标记。其中,我们通过设置标记的 yAxis 和 label 来控制标记的位置和显示内容。最后…

VL53L4CX TOF开发(2)----修改测距范围及测量频率

VL53L4CX TOF开发.2--修改测距范围及测量频率 概述视频教学样品申请完整代码下载测距范围测量频率硬件准备技术规格系统框图应用示意图生成STM32CUBEMX选择MCU串口配置IIC配置 XSHUTGPIO1X-CUBE-TOF1app_tof.c详细解释测量频率修改修改测距范围 概述 最近在弄ST和瑞萨RA的课程…

每日一题33:数据统计之广告效果

一、每日一题 返回结果示例如下&#xff1a; 示例 1&#xff1a; 输入&#xff1a; Ads 表: ------------------------- | ad_id | user_id | action | ------------------------- | 1 | 1 | Clicked | | 2 | 2 | Clicked | | 3 | 3 | Viewed…

系统架构设计师重难点知识脑图

大家都知道现在的软考自从变成机考后&#xff0c;越来越难了&#xff0c;教程上的内容不仅全还细&#xff0c;几乎任何内容都有可能考&#xff0c;出题老师主打一个出其不意&#xff0c;比如2024年5月考试&#xff0c;连UML时序图的片段都考&#xff0c;这 种如果看书的话一般都…

【乐吾乐3D可视化组态编辑器】数据接入

数据接入 本文为您介绍3D数据接入功能&#xff0c;数据接入功能分为三个步骤&#xff1a;数据订阅、数据集管理、数据绑定 编辑器地址&#xff1a;3D可视化组态 - 乐吾乐Le5le 数据订阅 乐吾乐3D组态数据管理功能由次顶部工具栏中按钮数据管理打开。 在新弹窗中选择数据订阅…

10倍速提升音乐制作,FL Studio21.2.9中文版揭秘!

FL Studio21中文版是数字音频工作站软件领域的一颗璀璨明星&#xff0c;它以强大的功能和直观的操作界面&#xff0c;赢得了音乐制作人和爱好者的广泛青睐。无论是专业音乐人还是初学者&#xff0c;都能通过这款软件探索和实现他们对音乐的创作和想象。本文将详细介绍FL Studio…

硬控全场的可视化大屏ui设计风格合集

硬控全场的可视化大屏ui设计风格合集

2021 hnust 湖科大 数据结构课设报告+代码

2021 hnust 湖科大 数据结构 课设报告代码 描述 hnust大一下学期数据结构课设的报告和源代码&#xff08;放在了附录里面&#xff09; 目录 项目名称完成日期页码复杂度分析(Ⅰ)2021-06-211—2复杂度分析(Ⅱ)2021-06-213—4Josephus问题(Ⅰ)2021-06-215—6Josephus问题(Ⅱ…

今日好料推荐(运维服务管理流程+互联网运维)

今日好料推荐&#xff08;运维服务管理流程互联网运维&#xff09; 本文内容是运维服务管理的梳理 参考资料内容&#xff1a;运维服务管理流程设计&互联网运维理论与实践 参考资料在文末获取&#xff0c;关注我&#xff0c;分享优质前沿资料&#xff08;IT、运维、编码、…

解决Linux中特殊文件名删除难题

最近在使用rz上传文件时出现中断&#xff0c;导致生成了乱码文件&#xff0c;尝试删除这些文件时遇到各种报错。 在Linux操作系统中&#xff0c;当尝试删除以特殊字符&#xff08;如-&#xff09;开头的文件时&#xff0c;可能会遇到错误信息&#xff0c;提示“invalid option”…

【excel】设置二级可变联动菜单

文章目录 【需求】在一级菜单选定后&#xff0c;二级菜单联动显示一级菜单下的可选项【步骤】step1 制作辅助列1.列转行2.在辅助列中匹配班级成员 step2 名称管理器step3 制作二级下拉菜单step4 消除二级菜单中的空白 【总结】 之前做完了 【excel】设置可变下拉菜单&#xff…