【图论】Floyd

算法-Floyd


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

思路

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

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

首先我们定义 d i j dij dij 为节点 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 ) dij=\min(dij,dik+dkj) dij=min(dij,dik+dkj)。

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


算法参数
  • 时间复杂度: 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,+) 的广义矩阵乘法,所以有时可以用于解决进阶问题。

相关推荐
lengxuenong12 分钟前
树状数组 · 信息学学习手册3-优化LIS
c++·学习·算法
fanfan_hongyun23 分钟前
【UE5.1 创建C++文件】
c++·ue5
动词ing29 分钟前
【题目练习】外观数列
算法
余额瞒着我当琳29 分钟前
C++11,发展历史浅谈,初始化列表和对象初始化,右值引用和移动语义
java·开发语言·c++·算法
suhan42 分钟前
【数据结构】六、图:4.图的遍历(深度优先算法DFS、广度优先算法BFS)
数据结构·算法·排序算法
suhan43 分钟前
【数据结构】六、图:3.十字链表、邻接多重表、边集数组
数据结构·算法·排序算法
Dola_Zou1 小时前
工商业储能系统核心策略
算法·自动化·软件工程
Tsuki_tl1 小时前
【优选算法:双指针】——复写零题解
java·c++·算法·leetcode·数组·双指针·复写零
Rain的Java大神之路1 小时前
面了上百人,我最爱问的LeetCode 1「两数之和」:能背代码的很多,能讲清“先查后存”的没几个
java·后端·算法
程序猿编码1 小时前
不用 PyTorch!从零手写 C++ 深度学习框架,自动微分、CUDA、分布式一把搞定
c++·深度学习·大模型推理·自动微分