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

代码随想录Day59|dijkstra(堆优化版)精讲、Bellman_ford 算法精讲

目录

    • dijkstra(堆优化版)精讲
      • 解题思路
        • 解法
    • Bellman_ford 算法精讲
      • 解题思路
        • 解法
    • 今日总结

dijkstra(堆优化版)精讲

题目链接:KamaCoder
文章讲解:代码随想录
视频讲解:bilibili

解题思路

  使用堆进行优化的初衷是,对于稀疏图来说,用点的方式进行遍历的开销较大,如果能对边进行求解,时空开销都将减小。
  实际上也是从起点出发,然后对起点所能到达的点进行距离修改,并将其加入堆中,由于是小顶堆,每次的堆顶都是当前从源点出发距离最小的点,并在在处理相应的点时才会对其进行访问标记,确保能够在处理该点之前得到源点到达该点的最小距离,因为标记过的点将不再更新距离。可以看到本质上还是和点处理方式相同,处理逻辑有了一点变化。

解法
#include <iostream>
#include <vector>
#include <list>
#include <queue>
#include <climits>using namespace std;class mycomparation{
public:bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs){return lhs.second > rhs.second;}    
};struct Edge{int to, val;
} ;int main(){int n, m;cin >> n >> m;vector<list<Edge>> grid(n+1);for(int i=0; i<m; i++){int s, t, val;cin >> s >> t >> val;grid[s].push_back({t, val});}int start = 1;int end = n;vector<int> minDis(n+1, INT_MAX);vector<bool> visited(n+1, false);priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparation> pq;pq.push({start, 0});minDis[start] = 0;while(!pq.empty()){pair<int, int> cur = pq.top();pq.pop();visited[cur.first] = true;for(Edge edge : grid[cur.first]){if(!visited[edge.to] && minDis[cur.first] + edge.val < minDis[edge.to]){minDis[edge.to] = minDis[cur.first] + edge.val;pq.push({edge.to, minDis[edge.to]});}}}if(minDis[end] == INT_MAX)  cout << -1 << endl;else cout << minDis[end] << endl;return 0;}
  • 时间复杂度:O(mlogm)O(mlogm)O(mlogm)
  • 空间复杂度:O(n+m)O(n+m)O(n+m)

Bellman_ford 算法精讲

题目链接:KamaCoder
文章讲解:代码随想录
视频讲解:bilibili

解题思路

  松弛是该算法的核心,从第一个点出发,每次都松弛所有的边,由于总共有n个点,那么进行n-1次松弛就能得到源点到达终点的最小开销。为什么n-1次就足够呢?首先,n-1次确保所有节点都能被松弛到,如果该点是从源点出发可到达的话;其次,想要到达终点,就必须走终点的入边,因此需要这些入边的出发点能够在n-1次松弛时已经知道从源点出发到达的最小距离。反观第一轮,源点到自身的距离最小,为0,那么第一轮松弛结束之后,源点出边能够到达的点的最小距离就确定下来了。更通俗的说即为,第一轮松弛之后,与源点 一条边 相连的点的最小距离被确定了下来,那么n-1轮之后就能定下来终点的最小距离。

解法
#include <iostream>
#include <vector>
#include <climits>using namespace std;int main(){int n, m;cin >> n >> m;vector<vector<int>> grid;for(int i=0; i<m; i++){int s, t, pri;cin >> s >> t >> pri;grid.push_back({s, t, pri});}int start = 1;int end = n;vector<int> minDis(n+1, INT_MAX);minDis[start] = 0;for(int i=0; i<n-1; i++){for(vector<int>& side : grid){int from = side[0];int to = side[1];int pri = side[2];if(minDis[from]!=INT_MAX && pri + minDis[from] < minDis[to]){minDis[to] = pri + minDis[from];}}}if(minDis[end]==INT_MAX)    cout << "unconnected" << endl;else    cout << minDis[end] << endl;return 0;
}
  • 时间复杂度:O(nm)O(nm)O(nm)
  • 空间复杂度:O(n)O(n)O(n)

今日总结

  补卡中()

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

相关文章:

  • 四川住建厅官方网站的网址教务管理系统学生登录入口
  • [MySQL]数据类型
  • 3w字一文讲透Java IO
  • 多模态学习大纲笔记(未完成)
  • 组织学习障碍:自我证明的陷阱
  • 【数据结构】顺序表的实现
  • 可以做兼职的网站质量好网站建设多少钱
  • 无声的战争:自动驾驶系统中的资源抢占、调度与生存法则
  • 30-机器学习与大模型开发数学教程-3-4 矩阵的逆与伪逆
  • 【大语言模型 104】LLM推理服务架构:从单机到分布式的演进之路
  • Rust所有权机制解析:内存安全的基石与实战指南
  • 个人做商业网站需要什么如何判断网站数据库类型
  • Spring容器进化论:从BeanFactory到ApplicationContext
  • 20.7 零样本多模态实战:CLIP模型如何让ChatPPT图像识别吞吐量飙升406%
  • 可以做平面设计兼职的网站佛山市网站建设分站哪家好
  • win11系统下配置c++机器学习库mlpack
  • [人工智能-大模型-72]:模型层技术 - 模型训练六大步:①数据预处理 - 基本功能与对应的基本组成函数
  • java基础-13 : 双列集合(Map)
  • 【十年后台管理系统】Redis的使用
  • SSM框架-MyBatis2
  • 深入理解JVM垃圾回收机制:从原理到实践
  • Spring的后处理器
  • 本地佛山顺德网站设计深圳市宝安区西乡街道
  • 监控 Linux 系统上的内存使用情况
  • 湖北省住房与建设厅网站高品质的网站开发
  • 智慧校园建设方案-6PPT(32页)
  • Spring的@Cacheable取缓存默认实现
  • MySQL-TrinityCore异步连接池的学习(七)
  • 2020应该建设什么网站建网站的论坛
  • 华为OD机考双机位A卷 - Excel单元格数值统计 (C++ Python JAVA JS GO)