当前位置: 首页 > 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.dtcms.com/a/284620.html

相关文章:

  • Redis 中的看门狗机制:分布式锁的守护者
  • 力扣每日一题--2025.7.17
  • Python基础③-函数篇
  • 【git 如何查看本地分支与远程分支之间的差异】
  • Solr7升级Solr8全攻略:从Core重命名到IK分词兼容,零业务中断实战指南
  • GLM(General Language Model,通用语言模型)
  • CCLink IE转ModbusTCP网关配置无纸记录器(中篇)
  • Python应用进阶DAY7--面向对象编程基本特性和super函数
  • 2025解锁“分身术”???
  • 微信小程序151~160
  • 针对教育行业的网络安全方案有哪些
  • 手机兼容测试服务提供商对比分析:如何选择最合适的测试平台
  • 输尿管下段积水预测与手术决策支持技术方案
  • 订货系统多角色支持核心实战指南
  • LLMFactory导出的Merge模型导入ollama
  • 从平面到时空:地图故事的时空叙事与沉浸式阅读
  • 征程 6 UCP 任务优先级 抢占简介与实操
  • Qt5 与 Qt6 详细对比
  • .NET 8.0 使用 WebSocket
  • 24、鸿蒙Harmony Next开发:不依赖UI组件的全局自定义弹出框 (openCustomDialog)
  • 趋势分析:从数据波动中读懂产品的 “健康信号”
  • 使用 docker 安装 openldap
  • JMeter在Linux命令行模式下执行的核心参数及使用场景,结合官方文档与实战经验整理,便于快速查阅
  • 【软件开发】Copilot 编码插件
  • demComponent
  • Java常用命令汇总
  • 中兴B860AV5.1-M2_S905L3SB最新完美版线刷包 解决指示灯异常问题
  • 微服务网站开发学习路线与RuoYi-Cloud实战指南
  • Spring Boot 监控:AOP vs Filter vs Java Agent
  • BI 数据可视化平台建设(3)—首页性能提升实践