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

代码随想录算法训练营第五十九天|图论part9

dijkstra(堆优化版)精讲

文章讲解:代码随想录

题目链接:47. 参加科学大会(第六期模拟笔试)

operator()函数调用运算符重载(Function Call Operator Overload),它让一个对象可以像函数一样被调用。

std::priority_queue<T, Container, Compare> 中,三个模板参数的含义如下 :

默认是大顶堆

T:元素类型
Container:底层容器类型

Compare:比较器

朴素迪杰斯特拉算法:

1.选取距离源节点并且未访过的节点

2.标记选取节点为已访问

3.更新权重

现在改为用邻接链表去存储图

list是双向链表

不支持随机访问

#include <iostream>
#include <vector>
#include <queue>
#include <list>
#include <climits>//用来方便定义邻接链表
using namespace std;
struct Edge{int to,val;Edge(int _to,int _val):to(_to),val(_val){}
};
struct cmp{bool operator()(pair<int,int>a,pair<int,int>b){return a.second>b.second;}
};int main(){int n,m;cin>>n>>m;vector<list<Edge>>grid(n+1);//邻接链表for(int i=0;i<m;i++){int s,e,v;cin>>s>>e>>v;grid[s].push_back(Edge(e,v));}int start=1;int end=n;vector<int>minDist(n+1,INT_MAX);vector<bool>isVisited(n+1,false);//优先队列 存储节点及节点到源点的距离priority_queue<pair<int,int>,vector<pair<int,int>>,cmp>pq;minDist[start]=0;pq.push({start,0});while(!pq.empty()){//取最近点auto cur=pq.top();pq.pop();if(isVisited[cur.first])continue;//标记为已读isVisited[cur.first]=true;//更新minDist数组list<Edge> edges=grid[cur.first];for(auto it=edges.begin();it!=edges.end();it++){if(!isVisited[it->to]&&minDist[cur.first]+it->val<minDist[it->to]){minDist[it->to]=minDist[cur.first]+it->val;pq.push({it->to,minDist[it->to]});}}}if(minDist[end]==INT_MAX) cout<<-1;else cout<<minDist[end];}

Bellman_ford

题目链接:94. 城市间货物运输 I

文章讲解:代码随想录

带有负权值的单源最短路径

核心思想:

对所有边进行n-1次松弛操作

#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int main(){int n,m;cin>>n>>m;vector<vector<int>>grid;while(m--){int s,t,v;cin>>s>>t>>v;grid.push_back({s,t,v});}vector<int>minDist(n+1,INT_MAX);minDist[1]=0;for(int i=1;i<n;i++){for(int j=0;j<grid.size();j++){int s=grid[j][0];int t=grid[j][1];int val=grid[j][2];if(minDist[s]==INT_MAX)continue;minDist[t]=min(minDist[s]+val,minDist[t]);}}if(minDist[n]!=INT_MAX){cout<<minDist[n];}else cout<<"unconnected";
}


 

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

相关文章:

  • 下一代防火墙总结
  • 【软考中级网络工程师】知识点之 PPP 协议:网络通信的基石
  • Stlink识别不到-安装驱动
  • Hutool-RedisDS:简化Redis操作的Java工具类
  • 【Python 小脚本·大用途 · 第 1 篇】
  • 在VMware中安装统信UOS桌面专业版
  • Python 的浅拷贝 vs 深拷贝(含嵌套可变对象示例与踩坑场景)
  • 基础算法(11)——栈
  • 【3D图像技术分析与实现】CityGaussianV2 工作解析
  • log4cpp、log4cplus 与 log4cxx 三大 C++ 日志框架
  • 机器学习数学基础:46.Mann-Kendall 序贯检验(Sequential MK Test)
  • Java集合框架、Collection体系的单列集合
  • 有限元方法中的数值技术:追赶法求解三对角方程
  • 【鸿蒙/OpenHarmony/NDK】什么是NDK? 为啥要用NDK?
  • PCB知识07 地层与电源层
  • LLIC:基于自适应权重大感受野图像变换编码的学习图像压缩
  • 每日一题:使用栈实现逆波兰表达式求值
  • Redis高级
  • AAAI 2025丨具身智能+多模态感知如何精准锁定目标
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘ray’问题
  • Python数据分析常规步骤整理
  • Mysql系列--5、表的基本查询(下)
  • Speaking T2 - Dining Hall to CloseDuring Spring Break
  • 机器学习 DBScan
  • 一键复制产品信息到剪贴板
  • 【接口自动化】初识pytest,一文讲解pytest的安装,识别规则以及配置文件的使用
  • 网闸技术解析:如何实现对国产数据库(达梦/金仓)的深度支持
  • AI 代理框架:使用正确的工具构建更智能的系统
  • 网络小工具发布 IPPw
  • 机器学习之K-means(K-均值)算法