通过三重循环遍历来寻找两个顶点之间的最短路径[示例]

弗洛伊德-沃舍尔算法(Floyd-Warshall Algorithm)是一种用于解决所有节点对之间最短路径的动态规划算法。它能够有效地计算出图中任意两个节点之间的最短路径长度。

这个算法的基本思想是通过逐步迭代来寻找两个顶点之间的最短路径。它的核心思想是利用中间节点,逐步更新路径长度,直到找到所有节点之间的最短路径。具体来说,算法通过三重循环遍历所有节点对,对于每一对节点 `(i, j)`,尝试通过节点 `k`(其中 `k` 可以是任意节点)来缩短从节点 `i` 到节点 `j` 的距离。如果通过节点 `k` 能够获得更短的路径,就更新从节点 `i` 到节点 `j` 的距离为新的更短路径长度。

算法的时间复杂度为 O(V^3),其中 V 是节点的数量。虽然在某些情况下可能存在更高效的算法(如 Dijkstra 算法用于单源最短路径问题),但弗洛伊德-沃舍尔算法具有优势,因为它能够处理包含负权边的图,并且适用于稀疏图或密集图,不需要进行单源最短路径计算。

总的来说,弗洛伊德-沃舍尔算法是一种非常实用且经典的算法,用于解决图中所有节点对之间的最短路径问题。

弗洛伊德-沃舍尔算法的基本步骤:
1. 初始化距离矩阵:创建一个二维数组来存储任意两个节点之间的最短距离。如果两个节点之间有直接连接,则用连接的边的权重初始化距离矩阵;否则,用一个足够大的值(例如无穷大)表示它们之间没有直接连接。
2. 逐步更新距离矩阵:对于每一对节点 (i, j),以及对于每一个中间节点 k,如果通过节点 k 可以使得从节点 i 到节点 j 的路径更短(即 `dist[i][k] + dist[k][j] < dist[i][j]`),则更新距离矩阵中的距离为 `dist[i][k] + dist[k][j]`。
3. 重复步骤 2,直到所有节点对之间的最短路径都被计算出来。

4. 检查负权回路:如果任何节点对之间存在负权回路,则算法无法得到正确结果,因为负权回路可能导致无限循环。通常,算法会通过检查距离矩阵的对角线元素是否为负值来检测负权回路。
弗洛伊德-沃舍尔算法的时间复杂度为 O(n^3),其中 n 是图中的节点数。虽然它的运行时间相对较长,但它对于解决包含少量节点的图的最短路径问题非常有效。 

这段代码是弗洛伊德-沃舍尔算法的核心部分,用于通过中间节点进行松弛操作让我们来解释一下每个部分的作用:
- `for k in range(V):`:这个循环遍历所有可能的中间节点,其中 `V` 是节点的数量。在每次迭代中,我们考虑是否通过节点 `k` 可以找到更短的路径。
- `for i in range(V):`:这个循环遍历所有可能的起始节点。
- `for j in range(V):`:这个循环遍历所有可能的目标节点。

在每次迭代中,我们考虑从节点 `i` 到节点 `j` 的距离,然后检查是否可以通过中间节点 `k` 获得更短的路径。如果可以,我们就更新节点 `i` 到节点 `j` 的距离为新的更短路径长度。
这个三重循环的嵌套确保了我们对每对节点之间的路径都进行了检查和更新,直到找到了所有节点对之间的最短路径。 

def floyd_warshall(graph):V = len(graph)dist = [[0] * V for _ in range(V)]# 初始化距离矩阵for i in range(V):for j in range(V):dist[i][j] = graph[i][j]# 这段代码是弗洛伊德-沃舍尔算法的核心部分,用于通过中间节点进行松弛操作。让我们来解释一下每个部分的作用:# - `for k in range(V):`:这个循环遍历所有可能的中间节点,其中 `V` 是节点的数量。在每次迭代中,我们考虑是否通过节点 `k` 可以找到更短的路径。# - `for i in range(V):`:这个循环遍历所有可能的起始节点。# - `for j in range(V):`:这个循环遍历所有可能的目标节点。# 在每次迭代中,我们考虑从节点 `i` 到节点 `j` 的距离,然后检查是否可以通过中间节点 `k` 获得更短的路径。# 如果可以,我们就更新节点 `i` 到节点 `j` 的距离为新的更短路径长度。# 这个三重循环的嵌套确保了我们对每对节点之间的路径都进行了检查和更新,直到找到了所有节点对之间的最短路径。# 通过中间节点进行松弛for k in range(V):for i in range(V):for j in range(V):if dist[i][k] + dist[k][j] < dist[i][j]:dist[i][j] = dist[i][k] + dist[k][j]return distdef print_solution(dist):V = len(dist)print("最短路径距离:")for i in range(V):for j in range(V):if dist[i][j] == float('inf'):print("INF", end="\t")else:print(dist[i][j], end="\t")print()graph = [[0, 2, 4, 6],[2, 0, 3, float('inf')],[4, 3, 0, 5],[6, float('inf'), 5, 0]
]# 执行算法
distances = floyd_warshall(graph)# 打印结果
print_solution(distances)

 最短路径距离:
0       2       4       6
2       0       3       8
4       3       0       5
6       8       5       0
请按任意键继续. . .

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

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

相关文章

知识付费语音问答系统的商业模式,在线教育有哪些付费推广渠道?

在线教育越发火热&#xff0c;那么竞争也就越激烈。目前在线教育行业有一大痛点那就是难以获取用户&#xff0c;在这种情况下光靠免费渠道获取流量是远远不够的。那么在线教育付费推广方法有哪些? 1、SEM&#xff1a; SEM就是大家常说的竞价广告&#xff0c;包括百度竞价、360…

前端内嵌iframe网页单点登录的三种方式

背景&#xff1a;我们开发中会遇到让内嵌的iframe进行登录&#xff0c;但是有希望是单点登录&#xff0c;不想多次登录 目录 方法一&#xff1a;共享sessionStorage或localStorage 方法二&#xff1a;设置内嵌iframe的url参数 方法三&#xff1a;通过父子页面通信postMessage…

共赴科技盛会“2024南京智博会”11月在南京国际博览中心召开

2024年&#xff0c;南京这座历史悠久的文化名城迎来了一场科技与智慧交织的盛会——南京智博会|南京国际智慧城市、物联网、大数据。本次博览会以智慧城市、人工智能、消费电子、物联网、大数据为主题&#xff0c;汇聚了全球各地的智能科技精英&#xff0c;共同探讨智慧城市建设…

46 udp网络程序

查询网络服务的命令 netstat -nlup n: 显示数字 a&#xff1a;显示所有 u&#xff1a;udp服务 p&#xff1a;显示pid Recv-Q收到的数量&#xff0c;本地ip和远端ip&#xff0c;00表示可以收到任何地址 网络聊天 服务端 定义一个server类&#xff0c;成员保存ip地址&#xff…

龟兔赛跑(基于GUI与多线程实现)

直击龟兔赛跑现场 下面这张图是我们设计龟兔赛跑界面的初始效果与基本组成结构&#xff1a; 接下来是我仅代表我个人提出的一些疑问与解答&#xff1a; 1、俩动物以图片的形式显示&#xff1f; 其实在这里两个动物类就像标签一样 标签组件是什么&#xff1f;用于短文本字符串…

从loss角度理解LLM涌现能力

如今的很多研究都表明小模型也能出现涌现能力&#xff0c;本文的作者团队通过大量实验发现模型的涌现能力与模型大小、训练计算量无关&#xff0c;只与预训练loss相关。 作者团队惊奇地发现&#xff0c;不管任何下游任务&#xff0c;不管模型大小&#xff0c;模型出现涌现能力…

云贝教育 |【直播课】5月19日Oracle 19c OCM认证大师课 即将上课了!(附课件预览)

贝教育独家认证课OCM全网价格最低&#xff0c;性价比最高&#xff01;&#xff01;&#xff01; Oracle 19c OCM认证大师培训 - 课程体系 - 云贝教育 (yunbee.net) OCM部分课件预览 Oracle Database 19c Certified Master Exam (OCM) 认证大师 25 天 / 150课时 什么是Oracle 1…

0X JavaSE-- UML、

# Unified Modeling Language UML 统一建模语言 UML 是一种图形化的语言。 UML 不是专门为 Java 准备的。 只要是面向对象的编程语言&#xff0c;开发前的设计&#xff0c;都需要画 UML 图进行系统设计。 最常用的四个 UML 图是 类图&#xff08;Class Diagram&#xff09;&…

启明云端ESP32 C3 模组WT32C3通过 MQTT 连接 AWS

ESP32-C3因为其性价比高&#xff0c;价格便宜性能又好一直是量产的首选芯片&#xff0c;随着量产项目扩大&#xff0c;对接云服务器的情况也增加了&#xff0c;接下来小启给大家分享下启明云端ESP32-C3模组——WT32C3系列模组/开发板连接AWS亚马逊云方法。 WT32C3系列模组 WT3…

笨方法自学python(一)

我觉得python和c语言有很多相似之处&#xff0c;如果有c语言基础的话学习python也不是很难。这一系列主要是学习例题来学习python&#xff1b;我用的python版本是3.12 代码编辑器我用的是notepad&#xff0c;运行py程序用cmd 现在开始写第一个程序&#xff1a; print ("…

ViLT 浅析

ViLT 浅析 论文链接&#xff1a;ViLT 文章目录 ViLT 浅析创新点网络结构总结 创新点 本文先分析了4种不同类型的Vision-and-Language Pretraining(VLP) 其中每个矩形的高表示相对计算量大小&#xff0c;VE、TE和MI分别是visual embedding、text embedding和modality interact…

Excel 根据分类及组内序号进行编码

例题描述和简单分析 Excel 记录课程数据&#xff0c;未排序&#xff0c;部分如下&#xff1a; ABC1CourseDateTime2Word1-Sep-209:003Word1-Sep-209:004PowerPoint1-Sep-209:005Word1-Sep-2012:006PowerPoint1-Sep-2012:007Excel1-Sep-2012:008Word1-Sep-2012:00 现在要新增…

【CAD建模号】学习笔记(四):工作平面

工作平面介绍 CAD建模号右侧导航栏提供了很多便捷的工具&#xff0c;有测量工具、坐标系、模型和图层切换、视图切换等。 1. 测量工具组 测量工具可以测量图形的几何体积&#xff0c;长度&#xff0c;角度等。工具组包含如下&#xff1a; 测量几何&#xff1a;可以测量图形的面…

笨方法自学python(二)-注释

注释和#号 程序里的注释是很重要的。它们可以用自然语言告诉你某段代码的功能是什么。在你想要临时移除一段代码时&#xff0c;你还可以用注解的方式将这段代码临时禁用。 # A comment, this is so you can read your program later. # Anything after the # is ignored by py…

【Python】IPython 魔法命令使用指南

依然记得从你口中 说出再见坚决如铁 昏暗中有种烈日灼身的错觉 黄昏的地平线 划出一句离别 爱情进入永夜 依然记得从你眼中 滑落的泪伤心欲绝 混乱中有种热泪烧伤的错觉 黄昏的地平线 割断幸福喜悦 相爱已经幻灭 &#x1f3b5; 周传雄《黄昏》 %run - 运行…

面向对象的三大特性:封装、继承、多态

一、封装 封装是面向对象的核心思想。是以类为载体&#xff0c;将对象的属性和行为封装起来&#xff0c;对外隐藏其实现细节。 封装保证了类内部数据结构的完整性&#xff0c;使得外部&#xff08;使用该类的用户&#xff09;不能轻易地直接操作此数据结构&#xff0c;只能执…

考了PMP后,NPDP到底还有没有必要考?NPDP通关宝典来啦!

NPDP和PMP相比&#xff0c;两者的相同点都是由美国发起的&#xff0c;都是管理行业的证书。区别也很大&#xff0c;PMP是项目经理国际认证证书&#xff0c;NPDP是产品经理认证证书&#xff0c;不过PMP已经由外专局引入国内二十多年了&#xff0c;在市面上知名度更高&#xff0c…

svg 元素 getBoundingClientRect() 数值为 0

问题 在页面在刷新时&#xff0c;想要立即获取页面中 svg 元素的宽高&#xff0c;做进一步的计算。发现通过 getBoundingClientRect 获取会有一定几率获取值为 0。 解决方案 监听 svg 元素的 load 事件&#xff0c;在回调中再获取。 svgElem.addEventListener("load&…

Vite创建Vue3项目识别 ../ 与 @/ 引入路径

在使用vite脚手架生成项目时,会出现一些引入路径失败的错误 例子:router中用 component引入路径时 引入 ../ 路径失败 找不到模块“../views/login/index.vue”或其相应的类型声明 {path: "/login",name: "login",component: () > import("../v…

鸿蒙开发接口Ability框架:【(窗口扩展能力)】

窗口扩展能力 WindowExtensionAbility基于ExtensionAbility&#xff0c;WindowExtensionAbility中展示的内容作为一个控件(AbilityComponent)内容展示在其他应用窗口中&#xff0c;实现在一个窗口中展示多个应用程序内容的功能。 说明&#xff1a; 本模块首批接口从API versio…