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

图论-最短路 Bellman-Ford算法

文章目录

  • Bellman-Ford算法
    • SPFA优化
    • 路径记录与传输

Bellman-Ford算法

此算法是基于松弛操作的单源最短路算法。
e[u]存u点的出边的邻边和边权,d[u]存u点到源点的距离。

  • 1.初始化,d[s]=0,d[其他点]=INT_MAX。
  • 2.执行多轮循环,对所有边都尝试进行一次松弛操作。
  • 3.当一轮中没有成功的松弛操作时,算法停止。

如图,3为源点
在这里插入图片描述
代码展示

struct edug{int v,w;
}; 
vector<edge>e[N];
int d[N];
bool Bellman-Ford(int s)
{//把所有点到源点的距离初始为无穷大memset(d,0x3f3f3f,sizeof d);d[s]=0;//源点到自身的距离为0bool f;//标记是否有松弛操作for(int i=1;i<=n;i++)//n轮操作 {f=false;for(int u=1;u<=n;u++)//n个点 {if(d[u]==0x3f3f3f)continue;for(auto x:ed[u])//遍历u的出边 {int v=x.v,w=x.w;if(d[u]+w<d[v]){d[v]=d[u]+w;f=true;}}}if(!f)break;//没有得到更新就退出 } return f;//第n轮=true则有环 
}int main()
{cin>>n>>m>>s;for(int i=0;i<m;i++){cin>>a>>b>>c;e[a].push_back({b,c});}return 0;} 

优点:
可以正确处理负边权
可以判负环,如果n轮循环后仍存在能松弛的边,则说明存在负环。
时间复杂度:O(nm)

SPFA优化

我们可以想到只有本轮被更新的点,其出边才有可能引起下一轮的松弛操作,因此用队列来维护被更新的点的集合。
vis[u]标记u点是否在队内,cnt[v]记录边数,判负环。

  • 1.初始化,s入队,并标记s在队内,d[s]=0,d[其他点]=INT_MAX
  • 2.从队头弹出u点,标记u不在队内
  • 3.枚举u的所有出边,执行松弛操作,记录s到v的边数,并判负环。如果v不在队内则把v 压入队尾,并标记
  • 重复2,3操作,直到队列为空。

代码展示

struct edug{int v,w;
}; 
vector<edge>e[N];
int d[N];
queue<int>q;
bool spfa(int s)
{memset(d,0x3f3f3f,sizeof d);d[s]=0,vis[s]=1;q.push(s);while(q.size()){int u=q.front();q.pop();vis[u]=0;for(auto x:e[u]){int v=x.v,w=x.w;if(d[u]+w<d[v]){d[v]=d[u]+w;cnt[v]=cnt[u]+1;if(cnt[v]>=n)return true;if(!vis[v])q.push(v),vis[v]=1;}}}return false;
}

路径记录与传输

void dfs_path(int u)
{if(u==1){cout<<u<<" ";return ;}dfs_path(pre[u]);cout<<u<<" ";
}
http://www.xdnf.cn/news/16868.html

相关文章:

  • 一天两道力扣(7)
  • sqli-labs:Less-15关卡详细解析
  • 14day-ai入门-人工智能基础学习-OpenCV-图像预处理4
  • 链特异性文库是什么?为什么它在转录组测序中越来越重要?
  • Vue多请求并行处理实战指南
  • JSX语法
  • Cesium 快速入门(四)相机控制完全指南
  • 项目中如何追踪项目进度,避免项目延期如何追踪项目进度
  • Java客户端连接Redis
  • Ⅹ—6.计算机二级综合题19---22套
  • 大数据平台数仓数湖hive之拉链表高效实现
  • 学习日志23 python
  • Spring MVC体系结构和处理请求控制器
  • 【linux驱动开发】Vscode + Remote SSH + clangd + bear=内核源码阅读环境搭建
  • 三维开放场景图助力机器人自主导航!Point2Graph:点云驱动的三维开放词汇场景图端到端机器人导航
  • 蓝牙设备配对:从机发现主机全过程
  • 《质光相济:Three.js中3D视觉的底层交互逻辑》
  • 嵌入式仿真教学的革新力量:深圳航天科技创新研究院引领高效学习新时代
  • 学习笔记《区块链技术与应用》第三天 网络 难度
  • 【01】大恒相机SDK C++开发 —— 初始化相机,采集第一帧图像、回调采集、关闭相机
  • TGD第九篇:三维应用——视频边缘检测
  • Excel 知识点汇总
  • 爱普生002墨水与004墨水基本参数及支持机型
  • 行业热点丨仿真历史数据难以使用?如何利用几何深度学习破局,加速汽车工程创新
  • Java 17 新特性解析与代码示例
  • Linux的库制作与原理
  • Haproxy调度算法 - 静态算法介绍与使用
  • 为什么Android主线程与java主线程不同,不会退出?
  • 全栈:怎么把IDEA和Maven集成一下?
  • 前端框架Vue3(四)——组件通信及其他API