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

相关文章:

  • FastAPI 分层架构深度解析:从 Controller 到 Service 与 CRUD 层
  • 遥感影像分割不再靠蒙:eCognition ESP2插件保姆级安装与参数调试指南
  • 2026年上海市PMP培训机构哪家好?官方授权R.E.P.报考指南 - 众智商学院课程中心
  • 终极免费甘特图工具:GanttProject 让你轻松管理复杂项目
  • 2026年6月全国百达翡丽官方维修服务网点汇总,门店地址及售后电话一览 - 资讯快报
  • 基于Arduino与红外传感器的数字转速计设计与实现
  • 基于ESP32-CAM的3D打印机无线监控方案:从硬件选型到软件集成
  • 基于LM317的DIY可调稳压电源制作全攻略:从原理到实践
  • 2026年 磁铁全品类推荐榜单:钕铁硼/异形/方形/圆形/电机磁铁及锂电磁棒/磁组件源头厂家实力解析! - 品牌企业推荐师(官方)
  • 2026巴中市本地黄金回收铂金白银回收哪家强?TOP5 正规门店榜单 + 联系方式 - 中安检金银铂钻回收
  • 想选国内余热锅炉销售厂家?这几家值得你重点关注!
  • 荆门市地区2026年权威甄选:黄金回收白银铂金回收优质门店 TOP5 含详细电话 - 诚金汇钻回收公司
  • ThinkPad风扇控制终极指南:TPFanCtrl2双风扇管理工具详解
  • 别只盯着CNN/RNN了!用DBN+Python搞定你的第一个无监督特征提取项目
  • HoloDesk深度解析:从AR交互原理到实时物理模拟的工程实践
  • 计算机毕业设计之基于Hive的网易云音乐可视化系统的设计与实现
  • SSL 证书检查:网站 HTTPS 的“体检报告”,过期前再也不用手忙脚乱
  • 保姆级教程:手把手教你从中国移动云盘下载并安装Matlab 2023b(附文件安装密钥与替换bin文件夹避坑指南)
  • TrafficMonitorPlugins:构建高效智能的现代化系统监控生态
  • 低查重AI教材生成利器!一键搞定AI写教材,快速输出高质量教材内容!
  • 终极指南:如何快速解锁家庭网关的高级管理权限
  • 用Python和Matlab搞定东南大学齿轮箱数据集:从数据读取到故障分类实战
  • ShawzinBot终极指南:3分钟掌握MIDI转游戏按键的简单方法
  • 【会议征稿通知 | 佛山大学主办 | IEEE出版 | EI 、Scopus稳定检索】第九届结构工程与工业建筑国际学术会议(ICSEIA 2026)
  • 不只是安装:Keil C51 V9.61 新特性实测与51单片机编译效率提升指南
  • 快手视频下载终极指南:KS-Downloader无水印高清批量下载完全教程
  • 像素蛋糕全攻略:AI一键批量精修,摄影师的“效率神器”来了!
  • Mac窗口置顶神器Topit:三步打造你的专属多任务工作台
  • 终极流放之路2角色构建指南:Path of Building PoE2完全解析
  • Exendin (9-39) ;DLSKQMEEEAVRLFIEWLKNGGSGGAPPPPS