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

图论-最短路Floyd算法

文章目录

  • Floyd(弗洛依德)算法
    • 路径记录与输出

Floyd(弗洛依德)算法

动态规划算法,也称插点法。是全源最短路算法。
状态表示
d[k,i,j]表示从i到j,且中间只经过节点编号1~k的最短路径的长度。
状态计算
路径的选择分两种:

  • 1.路径不经过k点,继承原值:d[k,i,j]=d[k-1,i,j]
  • 2.路径经过k点,松弛操作d[k,i,j]=d[k-1,i,k]+d[k-1,k,j]

代码展示

void fioyd()
{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]);}}}
}

!!!
K一定要在最外层
k放在内层会出错。
因为该算法是通过递归,必须将k-1层的所有状态计算出来后才能得到第k层的值。
不管路径经不经过k点,计算都与k无关,可以省去第一维
初始化时:

  • 如果i,j两点间无边直接相连,d[i][j]初始化为无穷大
  • 如果有边,d[i][j]就是二者边权。
  • i=j,自身到自身的距离为0,d[i][j]=0。

枚举完n层后,所有的最短路都会被找出来了。

路径记录与输出

void path(int x,int y)
{if(p[x][y]==0)return ;int k=p[x][y];//x.y之间的最短路path(x,k);cout<<k<<" ";path(k,y); } 

完整代码

int d[N][N],p[N][N];
void fioyd()
{for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(d[i][j]>d[i][k]+d[k][j]){d[i][j]=d[i][k]+d[k][j];p[i][j]=k; }}}}
}
void path(int x,int y)
{if(p[x][y]==0)return ;int k=p[x][y];path(x,k);cout<<k<<" ";path(k,y); } 
floyd(){cin>>a>>b;cout<<a<<" ";path(a,b);cout<<b<<" ";}

时间复杂度:O(n3n^3n3)

http://www.dtcms.com/a/310024.html

相关文章:

  • OpenAI ChatGPT Agent横空出世:全能工具+实时交互,重新定义AI智能体的终极形态
  • 【go】switch用法梳理与总结
  • [论文阅读] 人工智能 + 软件工程 | Trae Agent:让AI智能体高效解决仓库级软件问题,登顶SWE-bench排行榜
  • gd32modbus从机移植
  • Nature图形复现—Graphpad绘制带P值的含数据点的小提琴图
  • etcd 的安装与使用
  • Go语言中的盲点:竞态检测和互斥锁的错觉
  • Python day31
  • qt中的手势
  • Element-plus的 ElMessage 另一种展示形式
  • 1.6万 Star 的流行容器云平台停止开源
  • 【n8n】如何跟着AI学习n8n【04】:错误处理与日志监控
  • 学习游戏制作记录(各种水晶能力以及多晶体)8.1
  • 流式编程终端操作
  • UnionApplication
  • 【C++/STL】vector基本介绍
  • 关于cherryusb的in/out完成条件
  • WAIC现场速递:AI热浪扑面而来|小奇说
  • QD9361开发板教程:基于zynq的PS端的DDR3测试
  • Vue+Cesium 基础搭建
  • 智能体的未来:AGI路径上的关键技术突破
  • 分类预测 | Matlab实现CPO-PNN冠豪猪算法优化概率神经网络多特征分类预测
  • Win11怎样安装DirectX 9
  • 稳健标准误
  • 【苍穹外卖项目】Day05
  • draw_ctx中clip_area和buf_area的区别,为什么看起来差不多?
  • 第四篇:材质与纹理:让物体“真实“起来
  • Linux选择
  • evo_traj的参数设置及保存图片
  • van list 重复进入onload