【图论】Floyd

算法-Floyd


前置知识
  • dp基础
  • 图论基础

思路

Floyd 是一种优秀的全源最短路算法。

它的执行过程类似于 dp,如下:

首先我们定义 d [ i ] [ j ] d[i][j] d[i][j] 为节点 i i i 到节点 j j j 的最短距离。

我们枚举中转节点 k k k,再枚举两个节点 i , j i,j i,j,显然得到转移方程 d [ i ] [ j ] = min ⁡ ( d [ i ] [ j ] , d [ i ] [ k ] + d [ k ] [ j ] ) d[i][j]=\min(d[i][j],d[i][k]+d[k][j]) d[i][j]=min(d[i][j],d[i][k]+d[k][j])。

结束遍历后, d [ i ] [ j ] d[i][j] d[i][j] 即为答案。


算法参数
  • 时间复杂度: O ( n 3 ) O(n^3) O(n3)
  • 空间复杂度: O ( n 2 ) O(n^2) O(n2)

实现代码
cpp 复制代码
for (int k=1;k<=n;k++)
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)
			d[i][j]=min(d[i][j],d[i][k]+d[k][j]);

练习

注:在稀疏图中,Floyd 不如跑 n n n 遍 Dijkstra。但是 Floyd 其实是一种 ( min ⁡ , + ) (\min,+) (min,+) 的广义矩阵乘法,所以有时可以用于解决进阶问题。

相关推荐
七十二五1 小时前
matlab数据批量保存为excel,文件名,行和列的名称设置
经验分享·算法·matlab·青少年编程·矩阵·excel
请揣满RMB1 小时前
Qt常用控件——QRadioButton和QCheckBox
开发语言·c++·qt
阿巴~阿巴~1 小时前
C_深入理解指针(五) —— sizeof和strlen的对比、数组和指针笔试题解析、指针运算笔试题解析
c语言·开发语言·数据结构·算法
爱吃龙利鱼2 小时前
web群集--nginx常见的几种负载均衡调度算法的配置过程和效果展示
运维·算法·nginx·云原生·负载均衡
吴天德少侠4 小时前
c++返回一个pair类型
开发语言·c++
酷酷的崽7984 小时前
【数据结构】——原来排序算法搞懂这些就行,轻松拿捏
数据结构·算法·排序算法
八月的雨季 最後的冰吻5 小时前
C--字符串函数处理总结
c语言·前端·算法
Pandaconda6 小时前
【C++ 面试 - 新特性】每日 3 题(六)
开发语言·c++·经验分享·笔记·后端·面试·职场和发展
北南京海7 小时前
【C++入门(5)】类和对象(初始类、默认成员函数)
开发语言·数据结构·c++
阿拉伯的劳伦斯2927 小时前
LeetCode第一题(梦开始的地方)
数据结构·算法·leetcode