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

代码随想录算法训练营Day59 图论09 | Dijkstra(堆优化版)精讲、Bellman_ford 算法精讲

Dijkstra(堆优化版)精讲

还是非负权变最短路问题,堆优化是降低原始复杂度的一种写法,把每次寻找最小值的遍历操作改为使用小顶堆,每次取顶值元素就可实现寻找最小值的操作。

和朴素版的区别:

朴素版:遍历每个节点(n次,每次敲定一个节点的最短距离)-内循环再遍历n次,因为要比较所有节点的minDist的最小值-把最小cur标记为访问过-遍历所有节点看谁与cur连接并且经过cur之后到该节点的距离更短从而更新

堆优化版:把起点的{距离,节点}放入小顶堆 - while循环,只要堆不为空,就一直取顶弹出,判断是否访问过,如果访问过就continue,没访问过就标记访问,然后遍历graph[cur]所连接的各个节点,符合条件就更新,更新后再放入堆

注:堆优化版可以把同一节点编号但不同距离的pair放入堆中,因为大距离的pair会晚于小距离的pair被取到,然后标记访问过,之后再轮到大距离的pair时就直接continue了。

#include<iostream> using namespace std; #include<climits> #include<vector> #include<queue> int main(){ int n,m,s,t,val; cin>>n>>m; vector<vector<pair<int,int>>> graph(n+1); while(m--){ cin>>s>>t>>val; graph[s].push_back({t,val}); } vector<int> minDist(n+1,INT_MAX); vector<bool> visited(n+1,false); int start = 1; int end = n; minDist[start] = 0; priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq; pq.push({0,start}); while(!pq.empty()){ int curDist = pq.top().first; int cur = pq.top().second; pq.pop(); if(visited[cur]) continue; visited[cur] = true; //开始更新距离 for(auto& edge:graph[cur]){ int note = edge.first; int Dist = edge.second; if(!visited[note] && minDist[cur]+Dist<minDist[note]){ minDist[note] = minDist[cur]+Dist; pq.push({minDist[note],note}); } } } if(minDist[end]==INT_MAX) cout<<-1<<endl; else cout<<minDist[end]<<endl; }

Bellman_ford 算法精讲

bellman算法是应对最短路径问题中负权边但没有负权环的情况的。它也可以应对非负权边的最短路问题,只是效率没有dijkstra高。

思路:对每条边松弛n-1次,松弛的意思就是如果通过from到to这条边到to会让to的距离变小,就把minDist[to]更新为minDist[from]+val(from->to)

原因:每松弛一次,就会让所有已经有有效距离的节点向外走一步,所以松弛n-1次就会遍历完所有从起点到终点的路径,又由于每到一个节点都会经过路径更新,距离更小就更新,距离更大保持不变,所以最后留下的一定就是最小的节点到起点的距离了。

#include<iostream> using namespace std; #include<vector> #include<climits> int main(){ int n,m,s,t,val; cin>>n>>m; vector<vector<int>> graph; while(m--){ cin>>s>>t>>val; graph.push_back({s,t,val}); } vector<int> minDist(n+1,INT_MAX); minDist[1] = 0; for(int i=1;i<n;i++){ for(auto &edge:graph){ int from = edge[0]; int to = edge[1]; int price = edge[2]; if(minDist[from]!=INT_MAX && minDist[to]>minDist[from]+price){ minDist[to] = minDist[from]+price; } } } if(minDist[n]==INT_MAX) cout<<"unconnected"<<endl; else cout<<minDist[n]<<endl; }

http://www.jsqmd.com/news/943550/

相关文章:

  • 匠心守护:2026万国官方售后全链路服务实录及网点分布 - 速递信息
  • FastAPI 分层架构深度解析:从 Controller 到 Service 与 CRUD 层
  • 使用 hionic 将 Web 应用部署到鸿蒙PC平台
  • 效率提升:用快马平台为wsl环境定制自动化开发脚本工具
  • 若依 RuoYi-Vue 自定义车间设备模块 + 数据权限完整实现教程
  • 遥感影像分割不再靠蒙:eCognition ESP2插件保姆级安装与参数调试指南
  • 3分钟快速上手:Windows原生运行安卓应用的终极解决方案
  • 远恒集团荣登“2026中国品牌500强”,并斩获“品牌强国黑马榜·十大投资价值品牌”
  • 2026年上海市PMP培训机构哪家好?官方授权R.E.P.报考指南 - 众智商学院课程中心
  • 石家庄市地区2026年权威甄选:黄金回收白银铂金回收优质门店 TOP5 含详细电话 - 诚金汇钻回收公司
  • 【Flutter】Flutter 异步方法调用 ( async 和 await 关键字解析 | Dart 单线程 | await 调用方式对比 | Future<void> 返回值作用 )
  • 终极免费甘特图工具:GanttProject 让你轻松管理复杂项目
  • OpenRocket模型火箭设计软件:从零开始掌握火箭仿真与优化
  • 火灾事故动画还原需要注意哪些细节?
  • 保姆级教程:在Ubuntu 20.04上用Docker容器搞定PX4开发环境(附Java报错解决)
  • 微信收藏的图片到底存了几份?我用Python脚本帮你理清了Data、Temp、Thumb三大文件夹的关系
  • 2026年6月全国百达翡丽官方维修服务网点汇总,门店地址及售后电话一览 - 资讯快报
  • 免费开源图片去重神器:3步告别重复照片困扰的终极解决方案
  • CPT Markets:多维度评估平台运营与服务细节
  • 计算机毕业设计之基于flask框架的微博实时热点数据可视化设计与实现
  • 基于LM317的DIY可调稳压电源制作全攻略:从原理到实践
  • 基于ESP32-CAM的3D打印机无线监控方案:从硬件选型到软件集成
  • 2026年 磁铁全品类推荐榜单:钕铁硼/异形/方形/圆形/电机磁铁及锂电磁棒/磁组件源头厂家实力解析! - 品牌企业推荐师(官方)
  • 产品寿命预测实战:手把手用Python+Weibull模型评估5000次循环后的可靠性(附双侧/单侧置信区间代码)
  • 2026年6月昭通贵金属回收权威门店排行 TOP5 黄金 + 铂金 + 白银回收 附电话地址 - 中业金奢再生回收中心
  • C#零基础通关第十五篇:吃透特性Attribute与AOP编程,实现数据校验、权限拦截、架构解耦
  • TestDisk与PhotoRec:免费开源数据恢复双雄的完整使用指南
  • 不止于杀毒:火绒安全这些隐藏功能,才是电脑高手的秘密武器
  • 跨平台无障碍设计实践:从Web、VR到教室的包容性交互框架
  • Java流程控制语句详解