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

算法分享——弗洛伊德算法暴力破解多源最短路问题

算法简介:

弗洛伊德算法是一种求解“多源最短路”问题的算法

在弗洛伊德算法中,图一般用邻接矩阵存储,边权可正可负,但是(不能出现负环),整体思路是采用动态规划的思想求解任意两点间的最短距离。

准备工作:

我们只需要准备一个二维动态,规划数组dp[i][j]表示考虑到当前情况从点i到点j的最短距离,然后给数组初始化为无穷再不断更新最短距离。

算法复杂度分析:

由于需要循环来遍历中转点,起点和终点所以需要使用三层循环,时间复杂都是O(n3),复杂度很高,所以通常用来处理n<=500即图中的点的数量小于500的情况,这也是使用弗洛伊德算法的一个提示。

算法模板:

图片

其中最外层循环表示遍历所有的中转点,次外层循环表示遍历所有的起点,最内层循环表示遍历所有的终点,其中状态转移方程:

图片

表示加入中转点K后与不加入K时比较更新最短路径,这样任意两点的最短路径就会存储在dp数组中,我们根据需要取出即可。

实战应用:

图片

图片

这道题我们需要注意以下几点:

1.题目中给出了400个点是在提示我们可以使用弗洛伊德算法

2.需要注意自己到自己的距离始终为0,初始化要注意dp[i][i]=0

3.要注意无法到达应该输出-1

4.注意无向图的初始化要双向初始化

代码实现:

图片

#include<iostream>

using namespace std;

using ll = long long;

const int N = 405;

const ll inf = 2e18;//定义无穷

ll dp[N][N];

int main()

{

ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);//加速输入速度

int n, m, q;

cin >> n >> m >> q;

for (int i = 1; i <= n; ++i)

{

for (int j = 1; j <= n; ++j)

{

dp[i][j] = inf;//初始化无穷

}

dp[i][i] = 0;//自己到自己的距离始终为0,易错点

}

while (m--)//处理m条边权

{

ll u, v, w;

cin >> u >> v >> w;

dp[u][v] = min(dp[u][v], w);

dp[v][u] = min(dp[v][u], w);//无向图的初始化,w为两点间的边权

}

for (int k = 1; k <= n; ++k)

for (int i = 1; i <= n; ++i)

for (int j = 1; j <= n; ++j)

{

dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);

}

while (q--)

{

int st, ed; cin >> st >> ed;

cout << (dp[st][ed] >= inf ? -1 : dp[st][ed]) << "\n";//处理q次询问取出最短距离,路径不存在输出-1

}

return 0;

}

运行结果:

图片

对输入输出的图解:

图片

1到2的最短距离是1,1到3的最短距离是3,2到3的最短距离是2。

下一篇文章会介绍迪杰斯特拉解决最短路径问题。

相关文章:

  • Java-01-源码篇-04集合-05-ConcurrentHashMap(1)
  • 关于实际工作中如何定位、复现、解决bug的个人心得
  • DeepSeek 部署全指南:常见问题解析与最新技术实践
  • 【Linux网络编程】数据链路层和网络层的几个问题:MTU,校验和,全球网段,路由表
  • C1车证学习笔记
  • Ryu:轻量开源,开启 SDN 新程
  • Ubuntu及其衍生系统安装Python
  • 自制操作系统前置知识汇编学习
  • C++核心指导原则: 资源管理
  • centos7中Open-Webui的部署
  • dataframe如何在末尾添加多行
  • MySQL 中的锁:为数据安全加把锁
  • SMT贴片加工关键技术解析
  • 基于计算机视觉的手势识别:让机器理解我们的手势语言
  • leetcode day20 滑动窗口209+904
  • 基于 Python 的项目管理系统开发
  • 【前端】react大全一本通
  • 云图库平台(五)——后端图片模块开发
  • AIP-149 未设定域的值
  • 记录一次SpringMVC的406错误
  • 柳州警方通报临牌车撞倒行人:扣留涉事车辆,行人无生命危险
  • 俄罗斯总统普京:5月8日零时至11日零时实施停火
  • 亮剑浦江丨上海网信部门处罚一批医疗服务类互联网企业,三大类问题值得关注
  • 央行副行长:我们在研究丰富政策工具箱,将适时推出增量政策
  • 利物浦提前四轮英超夺冠,顶级联赛冠军数追平曼联
  • 出国留学、来华留学呈现双增新趋势,“00后留学生个性鲜明”