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

算法竞赛备赛——【图论】求最短路径——Floyd算法

floyd算法

基于动态规划
应用:求多源最短路 时间复杂度:n^3
dijkstra:不能解决负边权
floyd:能解决负边权 不能解决负边权回路问题
求最短路径:dijkstra bfs floyd

思路

1.让任意两点之间的距离变短:引入中转点k
通过k来中转 i---->k---->j < i----->j

2.找状态:
n个点都可以做中转点的情况下,i到j之间的最短路径的长度是x
最终状态:dp[n][i][j]=x;
中间状态:dp[k][i][j]=x;经过前k个点(1~k)做中转点的情况下,i到j之间的最短路径的长度是x
初始状态:dp[0][i][j]=a[i][j];

3.找状态转移方程
经过前k个点(1~k)做中转点的情况下,i到j之间的最短路径的长度是?
中间状态:dp[k][i][j]=?
前k-1个状态已知,前k-1个点(1~k-1)做中转点的情况下,i到j之间的最短路径的长度
if(dp[k][i][j]>dp[k-1][i][k]+dp[k-1][k][j])
dp[k][i][j]=dp[k-1][i][k]+dp[k-1][k][j]
else
dp[k][i][j]=dp[k-1][i][j];

代码实现

#include<iostream> 
using namespace std;
#define inf 0x7fffffff
int n, m;
int a[105][105];//邻接矩阵存图
int dp[105][105][105];int main() {cin >> n >> m;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {a[i][j] = inf;if (i == j) {a[i][j] = 0;}}}int x, y, w;for (int i = 1; i <= m; i++) {cin >> x >> y >> w;a[x][y] = w;}//初始化dpfor (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {dp[0][i][j] = a[i][j];}}for (int k = 1; k <= n; k++) {//枚举中转点for (int i = 1; i <= n; i++) {//枚举起点、终点for (int j = 1; j <= n; j++) {dp[k][i][j] = min(dp[k - 1][i][j], dp[k - 1][i][k] + dp[k - 1][k][j]);}}}//输出for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {cout << dp[n][i][j] << " ";}}return 0;
}

降维


#include<iostream> 
using namespace std;
//降维 三维降为二维
#define inf 0x7fffffff
int n, m;
int a[105][105];//邻接矩阵存图
int dp[105][105]; int main() {cin >> n >> m;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {a[i][j] = inf;if (i == j) {a[i][j] = 0;}}}int x, y, w;for (int i = 1; i <= m; i++) {cin >> x >> y >> w;a[x][y] = w;}//初始化dpfor (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {dp[i][j] = a[i][j];}}//三重循环的顺序不能变换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]);}}}//输出for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {cout << dp[i][j] << " ";}}return 0;
}
http://www.lryc.cn/news/590847.html

相关文章:

  • 【华为机试】122. 买卖股票的最佳时机 II
  • React 学习(4)
  • 研发知识系统选型实战:从 Notion 到 Gitee Wiki 的迭代经验
  • STM32 DMA通信详解
  • 求解偏微分方程的傅里叶积分解
  • ThreadLocal使用详解-从源码层面分析
  • Python 网络爬虫 —— requests 库和网页源代码
  • 智能体开发工具链全景图:IDE、调试器与监控平台
  • Fair-code介绍(Fair code)(一套新型软件模型:旨在“开源”“商业可持续性”中找到平衡)
  • Windows 11清理C盘方法大全:磁盘清理/禁用休眠/系统还原点/优化大师使用教程
  • Android默认背光亮度配置说明
  • 纯前端html实现图片坐标与尺寸(XY坐标及宽高)获取
  • SegNet:一种用于图像分割的深度卷积编码器解码器架构
  • RocketMQ 高可用集群架构与一致性机制解析
  • 【3D目标检测】Livox Tele-15采集的.lvx数据转.bag再转.pcd
  • 鲍威尔去留风波的AI量化解析:基于多模态数据驱动的金融市场脉冲响应研究
  • 达梦数据守护集群搭建(1主1实时备库1同步备库1异步备库)
  • 时序数据库选型指南 —— 为什么选择 Apache IoTDB?
  • javaweb学习开发代码_HTML-CSS-JS
  • Java面试(基础篇) - 第二篇!
  • slot=“trigger“ 覆盖了组件内部的 ref=“trigger“【详细来龙去脉版 5min】
  • Web开发 01
  • Python的“__name__“属性
  • visual freebasic教程-菜单栏
  • 视频码率是什么?视频流分辨率 2688x1520_25fps采用 h264格式压缩,其码率为
  • 线上协同办公时代:以开源AI大模型等工具培养网感,拥抱职业变革
  • Vim多列打开不同文件操作指南
  • Dijkstra 算法求解多种操作
  • 【真·CPU训模型!】单颗i7家用本,4天0成本跑通中文小模型训练!Xiaothink-T6-mini-Preview 技术预览版开源发布!
  • 腾讯云服务上下载docker以及使用Rabbitmq的流程