当前位置: 首页 > 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.lryc.cn/news/606943.html

相关文章:

  • SpringBoot与Rust实战指南
  • VS Code中配置使用slint(Rust)的一个小例子
  • Java学习第九十六部分——Eureka
  • 基于CNN卷积神经网络图像识别28个识别合集-视频介绍下自取
  • k8s之DevicePlugin
  • 运维端口管理闭环:从暴露面测绘到自动化封禁!
  • 自动驾驶的未来:多模态传感器钻机
  • 【通用视觉框架】基于OpenCvSharp+WPF+YOLO开发的仿VisionMaster的通用视觉框架软件,全套源码,开箱即用
  • CTF实战:用Sqlmap破解表单输入型SQL注入题(输入账号密码/usernamepassword)
  • 音频获取长度
  • armbian 启用nginx并设置访问密码
  • gpu instancer crowd 插件大规模渲染
  • 《操作系统真象还原》 第五章 保护模式进阶
  • 深度SEO优化的方式有哪些,从技术层面来说
  • WaitForSingleObject 函数参数影响及信号处理分析
  • 第15讲——微分方程
  • Shader开发(六)什么是着色器
  • 遥控器信号捕获
  • 软件反调试(7)- 基于NtSetInformationThread设置线程信息
  • 邮件系统哪个好?3种类型邮件系统详细对比
  • 阿里ai流式输出
  • OpenAI ChatGPT Agent横空出世:全能工具+实时交互,重新定义AI智能体的终极形态
  • java的冒泡排序算法
  • 多人命题系统
  • ⭐ Unity 实现UI视差滚动效果(Parallax)鼠标控制、可拓展陀螺仪与脚本控制
  • linux81 shell通配符:[list],‘‘ ``““
  • React Refs:直接操作DOM的终极指南
  • flutter——ColorScheme
  • DM8达梦数据库错误码信息汇编-8.1.4.80 20250430-272000-20149 Pack1
  • 【3】交互式图表制作及应用方法