算法学习笔记(最短路——Dijkstra)

D i j k s t r a Dijkstra Dijkstra是最常用,效率最高的最短路径算法,是单源最短路算法。核心是 B F S BFS BFS和贪心。

B F S BFS BFS传送门

D i j k s t r a Dijkstra Dijkstra大概分成以下几个步骤:

  1. 从起点出发扩展它的邻点。
  2. 选择一个最近的邻点继续向外拓展它的邻点。(贪心的思想,保证了拓展完之后该点一定是最短路径,不用重复拓展。若从不是从距离最近的点向外拓展,可能存在一条路从起点经过最近点到达该点,就需要重复计算。)
  3. 重复步骤 2 2 2直到所有点都被拓展过了。

如何快速地取得步骤 2 2 2中描述的所谓最近邻点?可以使用优先队列来实现。就是说用优先队列来代替原来 B F S BFS BFS中的普通队列。

算法复杂度: O ( m l o g 2 n ) O(mlog_2n) O(mlog2n)

算法缺点:边权不能为负数,若出现负边,则上述贪心思想失效(出现从另外一点经过一负边到达“最近点”的距离比原本到达“最近点”的距离短)。

存图:邻接表、前向星。


例题:【模板】最短路(2)- StarryCoding | 踏出编程第一步

题目描述

给定一个 n n n个点、 m m m条边的有向图,要求计算出点 1 1 1到点 n n n的最短距离。

可能存在重边和自环。

输入描述

第一行:两个整数 n , m n,m n,m。( 1 ≤ n , m ≤ 2 × 1 0 5 1 \le n,m \le 2 \times 10^5 1n,m2×105

接下来 m m m行:每行三个整数 u i , v i , w i u_i,v_i,w_i ui,vi,wi,表示存在一条从 u i u_i ui v i v_i vi,权值为 w i w_i wi的有向边。 ( 1 ≤ u i , v i ≤ n , 1 ≤ w i ≤ 1 0 6 ) (1 \le u_i, v_i \le n, 1 \le w_i \le 10^6) (1ui,vin,1wi106)

可能存在重边和自环。

输出描述

一个整数,表示从 1 1 1到点 n n n的最短距离;若不存在从点 1 1 1到点 n n n的路径,则输出 − 1 −1 1

输入样例1

3 3
1 2 5
2 3 2
1 3 10

输出样例1

7

详细解释见代码注释

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5 + 9;
const ll inf = 4e18;int n, m;struct Edge     //记录边
{int x; ll w;        //x:出点,w:边权bool operator < (const Edge &v) const   //重载运算符实现小根堆{return w > v.w;}
};vector<Edge> g[N];      //邻接矩阵存图
int vis[N];     //记录第i点是否被拓展过
ll d[N];        //d[i]表示从起点到点i的最短路径长度void dijkstra(int st)
{for(int i = 1; i <= n; ++i)     //初始化不要忘记{d[i] = inf;}d[st] = 0;//BFSpriority_queue<Edge> q;q.push({st, d[st]});        //将起点存入优先队列while(q.size()){int x = q.top().x;q.pop();//已经拓展过的点不再拓展,因为已经求得了最短路if(vis[x])continue;vis[x] = 1;for(auto &[y, w] : g[x]){//若出点也没拓展过且可以拓展,加入待拓展队列if(!vis[y] && d[y] > d[x] + w){d[y] = d[x] + w;q.push({y, d[y]});}}}
}void solve()
{cin >> n >> m;for(int i = 1; i <= m; ++i){int u, v, w; cin >> u >> v >> w;g[u].push_back({v, w});}dijkstra(1);cout << (d[n] == inf ? -1 : d[n]) << '\n';
}int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int _ = 1;while(_--) solve();return 0;
}

易错提示:不要忘记初始化,不要忘记初始化,不要忘记初始化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/5769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字旅游以科技创新为核心:推动旅游服务的智能化、精准化、个性化,为游客提供更加贴心、专业、高效的旅游服务

目录 一、引言 二、数字旅游以科技创新推动旅游服务智能化 1、智能化技术的应用 2、提升旅游服务的效率和质量 三、数字旅游以科技创新推动旅游服务精准化 1、精准化需求的识别与满足 2、精准化营销与推广 四、数字旅游以科技创新推动旅游服务个性化 1、个性化服务的创…

FIFO Generate IP核使用——Native Ports页配置

在使用FIFO Generate IP核时&#xff0c;如果在Basic选项页选择了Naitve接口&#xff0c;就需要配置Native Ports页&#xff0c;该页提供了针对FIFO核心的性能选项&#xff08;读取模式&#xff09;、数据端口参数、ECC&#xff08;错误检查和纠正&#xff09;以及初始化选项。…

「生存即赚」链接现实与游戏,打造3T平台生态

当前&#xff0c;在线角色扮演游戏&#xff08;RPG&#xff09;在区块链游戏市场中正迅速崛起&#xff0c;成为新宠。随着区块链技术的不断进步&#xff0c;众多游戏开发者纷纷将其游戏项目引入区块链领域&#xff0c;以利用这一新兴技术实现商业价值的最大化。在这一趋势中&am…

Flutter笔记:Widgets Easier组件库(8)使用图片

Flutter笔记 Widgets Easier组件库&#xff08;8&#xff09;&#xff1a;使用图片 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress o…

redis核心数据结构——跳表项目设计与实现(跳表结构介绍,节点类设计,随机层级函数)

跳表结构介绍。跳表是redis等知名软件的核心数据结构&#xff0c;其实现的前提是有序链表&#xff0c;思想的本质是在原有一串存储数据的链表中&#xff0c;间隔地抽出一半元素作为上一级链表&#xff0c;并将抽提出的元素和原先的位置相关联&#xff0c;这样重复下去直到最上层…

前端鼠标放上去显示更多内容demo

参考文献: title - HTML&#xff08;超文本标记语言&#xff09; | MDN (mozilla.org) <div class"up-detail" title"我是二五仔、总督小号、单曲切片人。 你甚至能在音 手 头条 管 港台bili ytb看到嘎的单曲。我是二五仔、总督小号、单曲切片人。 你甚至能…

【Mac】Axure RP 9(交互原型设计软件)安装教程

软件介绍 Axure RP 9是一款强大的原型设计工具&#xff0c;广泛用于用户界面和交互设计。它提供了丰富的功能和工具&#xff0c;能够帮助设计师创建高保真的交互原型&#xff0c;用于展示和测试软件应用或网站的功能和流程。以下是Axure RP 9的主要特点和功能&#xff1a; 交…

acwing算法提高之数据结构--平衡树Treap

目录 1 介绍2 训练 1 介绍 本博客用来记录使用平衡树求解的题目。 插入、删除、查询操作的时间复杂度都是O(logN)。 动态维护一个有序序列。 2 训练 题目1&#xff1a;253普通平衡树 C代码如下&#xff0c; #include <cstdio> #include <cstring> #include …

程序设计基础--C语言【五】

数组 目录 数组 5.1.一维数组 5.1.1.一维数组的引用 5.1.2.一维数组的初始化 5.1.3.一维数组的程序举例 5.2.二维数组 5.2.1.二维数组的定义 5.2.2.二维数组的引用 5.2.3.二维数组的初始化 5.2.4.举例 5.3.字符数组与字符串 5.3.1.字符组的初始化 5.3.2.字符数组…

算法人生(16):从“K均值 C均值”看“为人处事之道”

现代生活中&#xff0c;经常会听到一个词“双标”&#xff0c;通常用来描述某人对人对己采用了不同的标准&#xff0c;当然生活中会出现这样的情况&#xff0c;个人处于“利己”的思维来“双标”&#xff0c; 但“双标”可能还有另外一个原因&#xff0c;就是这个人是懂得“变通…

【介绍下大数据组件之Storm】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

MySQL-分页查询

MySQL分页查询 MySQL 分页查询原则&#xff1a; 在 MySQL 数据库中使用 LIMIT 子句进行分页查询。MySQL 分页中开始位置为 0。分页子句在查询语句的最后侧。 LIMIT子句 SELECT 投影列 FROM 表名 WHERE 条件 ORDER BY LIMIT 开始位置&#xff0c;查询数量;示例&#xff1a; …

Delta lake with Java--利用spark sql操作数据2

上一篇文章尝试了建库&#xff0c;建表&#xff0c;插入数据&#xff0c;还差删除和更新&#xff0c;所以在这篇文章补充一下&#xff0c;代码很简单&#xff0c;具体如下&#xff1a; import org.apache.spark.sql.SaveMode; import org.apache.spark.sql.SparkSession;publi…

C++ | Leetcode C++题解之第62题不同路径

题目&#xff1a; 题解&#xff1a; class Solution { public:int uniquePaths(int m, int n) {long long ans 1;for (int x n, y 1; y < m; x, y) {ans ans * x / y;}return ans;} };

附录6-4 黑马优购项目-分类和购物车

目录 1 分类 1.1 接口 1.2 窗口限制 1.3 选中状态样式判断 1.4 点击左侧时右侧会到顶点 1.5 源码 2 购物车 2.1 store 2.2 tabBar徽标 2.3 滑动删除 2.4 结算 2.4.1 结算前登录 2.4.2 结算功能 2.5 触发组件事件 2.6 源码 1 分类 分类最上部是…

11【PS Blender 作图】场景作图 景深

【问题背景】 看下图,是一个插画师的作图,是不是好像现实场景;合理利用景深,让画面好像是3D现实场景 那么如何才能完成这样让人身临其境的画面呢? 大体有两个方法: 【1】2D插画,合理利用景深;如用PS画图,在画图的时候注意 画面构图,让2D的画面,看起来像3D 缺点…

小程序wx.getlocation接口如何开通?

小程序地理位置接口有什么功能&#xff1f; 随着小程序生态的发展&#xff0c;越来越多的小程序开发者会通过官方提供的自带接口来给用户提供便捷的服务。但是当涉及到地理位置接口时&#xff0c;却经常遇到申请驳回的问题&#xff0c;反复修改也无法通过&#xff0c;给的理由…

【免费Java系列】大家好 ,今天是学习面向对象高级的第二天点赞收藏关注,持续更新作品 !

day02——面向对象高级 今天我们继续学习面向对象的语法知识&#xff0c;我们今天学习的主要内容是&#xff1a;多态、抽象、接口。 学会这些语法知识&#xff0c;可以让我们编写代码更灵活&#xff0c;代码的复用性更高。 一、多态 接下来&#xff0c;我们学习面向对象三大…

一文理解前端如何调用后端(java)方法

阅读完文章大约需要3~5分钟 文章目录 一、什么是后端方法路径&#xff1f;二、ajax、axios调用后端方法总结 一、什么是后端方法路径&#xff1f; 这里针对的是 java 后端项目中在 controller 文件夹中的类文件&#xff0c;这类文件的后缀一般都会带有 controller&#xff0c…

k8s-实战——kubeadm安装1.30.0

文章目录 1介绍1.1软件架构1.2版本介绍1.3组件列表2操作步骤2.1环境准备2.2获取脚本2.3节点初始化2.4组件下载2.4.1脚本执行2.4.2目录组件2.5脚本修改2.5.1修改host文件2.5.2验证ansible配置2.6安装k8s集群2.6.1查看证书有效期