代码随想录算法训练营第60天| 图论 dijkstra算法 Bellmanford算法

news/2024/9/18 21:18:44/ 标签: 算法, 图论, 最短路径, dijkstra算法

dijkstra算法(堆优化):

朴素版dijkstra算法的时间复杂度只和节点数量有关系,且时间复杂度为O(n^2)。当处理边很多的稠密图的时候,朴素版dijkstra算法没有问题。但是当遇到边很少的情况(稀疏图)时,时间开销有点过大了,因为朴素版的方法是建立一个二维数组,存储从一个点到另一个点是否存在边。当处理稀疏图时,由于边很少甚至有可能只有一条两条,所以绝大部分空间会被浪费。所以这个时候使用邻接矩阵并不合适,为此我们引入邻接表进行处理。邻接表就是建立一个用来存储链表的数组,每个链表的头节点就是起点,后面就是他指向的点。

dijkstra三部曲:1.找到源点到哪个点距离最近而且这个节点没有被访问过;2.将该节点标记为访问过;3.更新未访问节点到源点的距离。

卡码网:47.参加科学大会

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

思路:关于从边的角度怎么处理三部曲,我们可以把带权值的边存入小顶堆,因为小顶堆可以实现自动排序,这样我们在从小顶堆取元素时取出的就是距离源点最近的的节点所在的边。除此之外我们在往链表中存储元素时,存储的是节点和权值的键值对,即pair<int,int>。

代码:

#include <iostream>
#include <vector>
#include <list>
#include <queue>
#include <climits>
using namespace std;class mycomparison{public:bool operator()(const pair<int,int> &lhs, const pair<int,int> &rhs){//lhs表示左边的点 rhs表示右边的点return lhs.second > rhs.second;}
};struct Edge{int to;int val;//构造函数Edge(int t,int w): to(t),val(w){};//初始化列表
};int main(){int n,m,p1,p2,val;cin>>n>>m;//点数和边数vector<list<Edge>> grid(n+1);//链表里存的是Edge结构体for(int i=0;i<m;i++){cin>>p1>>p2>>val; //p1源点 p2终点grid[p1].push_back(Edge(p2,val));}int start = 1;int end = n;vector<int> minDist(n+1,INT_MAX);//存储源点到各个点的最大距离 初始化为最大值vector<bool> visited(n+1, false);//标记某个节点是否被访问过//优先级队列, 距离最小的节点在最上面 数据存入pair数组priority_queue<pair<int,int>, vector<pair<int,int>>, mycomparison> pq;pq.push(pair<int,int>(start,0));//到源点距离为0minDist[start]=0;while(!pq.empty()){//寻找距离源点最近的未访问的节点pair<int,int> cur = pq.top();//cur表示当前距离最近的节点pq.pop();if(visited[cur.first]) continue;//如果节点被访问过就跳过visited[cur.first]=true;//将当前访问的节点标记为true//更新未访问节点到当前节点的距离for(Edge edge : grid[cur.first]){//遍历当前节点为源点的所有边if(!visited[edge.to] && minDist[cur.first] + edge.val <minDist[edge.to]){minDist[edge.to] = minDist[cur.first] + edge.val;//将更新后的距离加入优先级队列pq.push(pair<int, int>(edge.to, minDist[edge.to]));}}}if(minDist[end] == INT_MAX) cout<<-1<<endl; //到达不了终点else cout<<minDist[end]<<endl;return 0;
}


http://www.ppmy.cn/news/1518340.html

相关文章

合宙低功耗4G模组Air780EQ——开发板使用说明

CORE-AIR780E 开发板是合宙通信推出的基于 Air780E 模组所开发的&#xff0c; 包含电源&#xff0c;SIM 卡&#xff0c;USB&#xff0c;天线&#xff0c;音频等必要功能的最小硬件系统。 以方便用户在设计前期对Air780E模块 进行性能评估&#xff0c;功能调试&#xff0c;软件…

React滚动加载(无限滚动)功能实现

在用户滚动到接近页面底部时自动加载更多内容 &#xff1a;可以将事件绑定在antd的Table组件中的onScroll中 &#xff1a;也可以将事件绑定在外层的div的onScroll中 const handleScroll (e) > {const { scrollTop, scrollHeight, clientHeight } e.target;if (scrollTo…

无人机之电池篇

无人机电池作为无人机的重要组成部分&#xff0c;其性能、使用、保养及选择都至关重要。以下是对无人机电池的综合介绍&#xff1a; 一、无人机电池的基本参数 电池容量&#xff1a;电池容量直接影响无人机的续航能力。大容量电池&#xff0c;如5000mAh的电池&#xff0c;能提…

【微信小程序】微信小程序如何使用 MobX 进行状态管理?

微信小程序官方在 2019 年针对小程序发布了 MobX 辅助绑定库&#xff0c;可以让我们在微信小程序中使用 Mobx 进行状态管理&#xff1a; mobx-miniprogram&#xff1a;相当于 MobX&#xff1b;mobx-miniprogram-bindings&#xff1a;针对小程序的 MobX 辅助绑定库&#xff0c;…

Unity 中使用SQLite数据库

文章目录 0.参考文章1.Presentation —— 介绍2.&#xff08;SQLite4Unity3d&#xff09;Unity中直接使用SQLite的插件3.创建数据库4.创建表5.Navicat Premium&#xff08;数据库可视化&#xff09;6.增删改查6.1 增6.2 删6.3 改6.4 查 0.参考文章 https://blog.csdn.net/Chin…

查看特定软件网络请求信息

开始 运行 输入 wmic 再输入 process get ProcessId,executablepath 获取指定软件的 pid&#xff0c;例如获取的 pid 是 11008 再 开始 运行 输入cmd 输入 netstat -ano|findstr 11008 即可获取该程序的网络请求信息 参考 https://blog.csdn.net/zhangge360/article/detai…

微信小程序服务器费用一年多少?微信小程序开发

在互联网时代&#xff0c;微信小程序已成为众多企业和个人拓展业务、提升服务品质的有力工具。然而对于许多准备涉足小程序领域的朋友来说【开发一个小程序大概需要多少钱】以及【微信小程序服务器费用一年需要多少】是首要关注的问题&#xff0c;今天飞飞将和你们分享小程序服…

两个月冲刺软考——SQL基础:排序、分组和聚合函数的实用指南

1.涉及到的部分基本语法 1.1 ORDER BY 与 GROUP BY ORDER BY用于对查询结果进行排序&#xff1b;默认是升序&#xff08;ASC&#xff09;&#xff0c;可以指定降序&#xff08;DESC&#xff09;。 GROUP BY用于将数据按照一个或多个列进行分组&#xff1b;通常与聚合函数&am…

Mybatis框架——缓存(一级缓存,二级缓存)

本章将简单介绍Mybatis框架中的缓存&#xff0c;欢迎大家点赞➕收藏&#xff0c;蟹蟹&#xff01;&#xff01;&#xff01;&#x1f495; &#x1f308;个人主页&#xff1a;404_NOT_FOUND &#x1f308;MyBatis环境搭建步骤&#xff08;超全解析&#xff01;&#xff01;&am…

网络安全 DVWA通关指南 DVWA File Upload(文件上传)

DVWA File Upload&#xff08;文件上传&#xff09; 文章目录 DVWA File Upload&#xff08;文件上传&#xff09;修复建议 LowMediumHighImpossible 修复建议 1、使用白名单限制可以上传的文件扩展名 2、注意0x00截断攻击&#xff08;PHP更新到最新版本&#xff09; 3、对上传…

关键字之sizeof

接下来我讲的是之前我提到过的C语言关键字 sizeof同时它也是C语言提供的操作符&#xff08;运算符&#xff09; 它的使用形式有两种 1 sizeof&#xff08;类型&#xff09; 2 sizeof 表达式 sizeof返回某种数据类型或某个值占用的字节数量&#xff0c;它的参数可以是数据类型…

怎样通过bs4找出程序中 标签<div class=“List2“>中所有的<li>的内容?

怎样通过bs4找出程序中 标签<div class"List2">中所有的<li>的内容&#xff1f; 可以使用 BeautifulSoup 的 find_all 方法来找到标签为 <div class"List2"> 中的所有 <li> 标签&#xff0c;并获取其内容。 以下是一个示例代码&…

【面试经验】美团基础研发部产品经理面试经验

3.12 投递 4.1 一面 4.11 二面 4.17 oc但拒 一面内容&#xff1a; 1、一个指数增长的脑经急转弯 2、对向量和向量值如何理解 ——类比函数&#xff0c;目的是映射和转化 3、transformer有没有看&#xff08;问到了注意力机制&#xff09; ——transformer的本质是一个编码…

http连接处理

分析http类及请求接收 基础 epoll epoll_create函数 #include <sys/epoll.h> int epoll_create(int size) 创建一个指示epoll内核事件表的文件描述符&#xff0c;该描述符将用作其他epoll系统调用的第一个参数&#xff0c;size不起作用。 epoll_ctl函数 #include …

基于Python的热门旅游景点数据分析系统【python-爬虫-大数据定制】

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、基于Python的热门旅游景点数…

sheng的学习笔记-AI-半监督聚类

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 半监督学习&#xff1a;sheng的学习笔记-AI-半监督学习-CSDN博客 聚类&#xff1a;sheng的学习笔记-AI-聚类(Clustering)-CSDN博客 均值算法&#xff1a;sheng的学习笔记-AI-K均值算法_k均值算法怎么算迭代两次后的最大…

论文阅读:VideoMamba: State Space Model for Efficient Video Understanding

论文地址&#xff1a;arxiv 摘要 为了解决视频理解中的局部冗余与全局依赖性的双重挑战。作者将 Mamba 模型应用于视频领域。所提出的 VideoMamba 克服了现有的 3D 卷积神经网络与视频 Transformer 的局限性。 经过广泛的评估提示了 VideoMamba 的能力&#xff1a; 在视觉领…

Zookeeper 日志输出到指定文件夹,并按照日期轮循输出

更改日志输出路径 如果不做修改&#xff0c;zookeeper的日志信息默认都打印到了zookeeper.out文件中&#xff0c;这样输出路径和大小没法控制&#xff0c;因为日志文件没有轮转。所以需要修改日志输出方式。具体操作如下&#xff1a; 1.修改${zkhome}/bin/zkEnv.sh ZOO_LOG_…

我的推荐:腾讯云罗云《从零构建向量数据库》

在2024年8月&#xff0c;好几本和数据库相关的图书相继出版&#xff0c;我以为&#xff0c;这恰恰是数据库领域蓬勃向上的一种表现。 数据库需要更多的人关注&#xff0c;哪怕是谈论&#xff0c;所以我的《数据库简史》是一种尝试&#xff0c;希望以一种科普的风格&#xff0c;…

信息安全数学基础(4)最大公因数

前言 在信息安全数学基础中&#xff0c;最大公因数&#xff08;Greatest Common Divisor, GCD&#xff09;是一个核心概念&#xff0c;它在密码学、数论等多个领域都有广泛应用。以下是对最大公因数的详细阐述&#xff1a; 一、定义 设a和b是两个非零整数&#xff0c;若整数d同…