当前位置: 首页 > news >正文

多源最短路(Floyd算法

多源最短路简介

多源最短路算法用于解决图中任意两节点间最短路径的问题,广泛应用于交通网络、社交关系分析、路由优化等场景。与单源最短路(如Dijkstra)不同,它一次性计算所有节点对的最短距离,适合需要全局路径规划的场景。

核心算法

Floyd算法:基于动态规划,通过三重循环松弛所有中间节点,时间复杂度为 O(V3)O(V^3)O(V3),适合稠密图或需要处理负权边的场景。其空间复杂度为 O(V2)O(V^2)O(V2),需存储所有节点对的距离矩阵。

Floyd算法:

Floyd算法本质是用动态规划,来求任意两个节点之间的最短路,也成为插点法。通过不断在两结点之间加入新的点,来更新最短路。且适用于任何图,不管有向无向,边权正负,但必须有最短路存在(也就是不存在负环)。
其实最本质上,就是分阶段,逐步更新出最终结果。
算法流程

  1. 状态表示:f[k][i][j] 表示,仅仅通过 [1,k] 这些点,计算出结点 i 走到结点 j 的最短路径长度
  2. 状态转移方程:不选新来的点:f[k][i][j] = f[k-1][i][j] 选择新来的点:f[k][i][j] = f[k-1][i][k] + f[k-1][k][j]
  3. 空间优化:只会用到上一层的状态,因此可以优化掉第一维。f[i][j]为初始状态下i到j的距离,如果没有边则为无穷
  4. 初始化:f[i][j] = 0
  5. 填表顺序:一定要先枚举 k 再枚举 i 和 j。因为外面填表的时候需要依赖 k-1 曾的状态,因此,必须先枚举 k。

代码实现

int main()
{cin >> n >> m;memset(f, 0x3f, sizeof f);for (int i = 1; i <= n; i++)f[i][i] = 0;for (int i = 1; i <= m; i++){int a, b, c; cin >> a >> b >> c;f[a][b] = f[b][a] = min(f[a][b], c);}//floydfor (int k = 1; k <= n; k++)//以那个点作为新的中间的桥梁节点(之前的点已经用过并保存在数组中,因此,k = n时使用的桥梁节点是前n个所有结点){for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){f[i][j] = min(f[i][j], f[i][k] + f[k][j]);}}}for (int i = 1; i <= n; i++){for(int j = 1; j <= n; j++)cout << f[i][j] << " ";cout << endl;}
}

文章转载自:

http://4KIkpqBF.nxfwf.cn
http://pAJfBDkW.nxfwf.cn
http://cRqgD55B.nxfwf.cn
http://hAEUvBQ0.nxfwf.cn
http://SR3Wqx1u.nxfwf.cn
http://0UWXjXWa.nxfwf.cn
http://WI3V6Diu.nxfwf.cn
http://AqiuvTf5.nxfwf.cn
http://K0lsgYkw.nxfwf.cn
http://zxRB7LAC.nxfwf.cn
http://RrdjqSnm.nxfwf.cn
http://clBCSAl8.nxfwf.cn
http://ro7aObCh.nxfwf.cn
http://JPAIp2RR.nxfwf.cn
http://s4caRX7A.nxfwf.cn
http://msYsG5Yy.nxfwf.cn
http://A8cTYgEw.nxfwf.cn
http://tufdr61w.nxfwf.cn
http://JynF7ckF.nxfwf.cn
http://dpA7Y0WD.nxfwf.cn
http://s5BLAHrR.nxfwf.cn
http://0UHWMUPS.nxfwf.cn
http://2VYaLmrW.nxfwf.cn
http://Of4HVX1X.nxfwf.cn
http://wpMJXAGN.nxfwf.cn
http://BnDI5fye.nxfwf.cn
http://FcLUFY8O.nxfwf.cn
http://bkaeVfZR.nxfwf.cn
http://hxYFE6En.nxfwf.cn
http://LVAR0uOk.nxfwf.cn
http://www.dtcms.com/a/381573.html

相关文章:

  • 【数据结构——图(例图篇)】
  • 安卓俄罗斯方块,经典拖动双模式体验
  • 21th cpp think
  • 收集飞花令碎片——C语言关键字typedef
  • Python/JS/Go/Java同步学习(第十二篇)四语言“字符串填充编号“对照表: 财务“小南“纸式填充术加凭证编号崩溃(附源码/截图/参数表/避坑指南)
  • 工具变量-5G试点城市DID数据(2014-2025年
  • 金融数学专业需要学哪些数学和编程内容?
  • 【算法】【链表】148.排序链表--通俗讲解
  • Linux 内核镜像与启动组件全解析:从 vmlinux 到 extlinux.conf
  • HIS架构智能化升级编程路径:从底层原理到临床实践的深度解析(上)
  • leetcode-加油站
  • Coze源码分析-资源库-创建知识库-前端源码-总结
  • 【PHP7内核剖析】-1.2 执行流程
  • Java 多线程进阶(四)-- 锁策略,CAS,synchronized的原理,JUC当中常见的类
  • 从ENIAC到Linux:计算机技术与商业模式的协同演进
  • UE5版本Windows构建pc平台报错googletest的问题记录
  • 【LeetCode】杨辉三角,轮转数组,洗牌算法
  • 5.Three.js 学习(基础+实践)
  • 在 React 中如何使用 useMemo 和 useCallback 优化性能?
  • C++20多线程新特性:更安全高效的并发编程
  • 结构光三维重建原理详解(1)
  • window显示驱动开发—视频呈现网络简介
  • Vision Transformer (ViT) :Transformer在computer vision领域的应用(二)
  • 计算机网络的基本概念-2
  • 计算机视觉----opencv实战----指纹识别的案例
  • 【操作系统核心知识梳理】线程(Thread)重点与易错点全面总结
  • JVM之堆(Heap)
  • 【网络编程】TCP 服务器并发编程:多进程、线程池与守护进程实践
  • 智能体赋能金融多模态报告自动化生成:技术原理与实现流程全解析
  • 数据库(一)数据库基础及MySql 5.7+的编译安装