【代码随想录训练营第42期 续Day58打卡 - 图论Part8 - Dijkstra算法

目录

一、Dijkstra算法

实现方式

1、使用优先队列(最小堆)

2、朴素法(简单数组) 

二、经典例题

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

题目链接

题解:朴素Dijkstra

 三、小结


一、Dijkstra算法

刚入门Dijkstra算法,可以看一下这个视频:最短路径查找—Dijkstra算法。

定义

Dijkstra算法是一种用于在带权图中找到从单一源点出发到所有其他顶点的最短路径的贪心算法

实现方式

Dijkstra算法主要有两种实现方式:使用优先队列(通常是最小堆)和朴素法(使用简单的数组)。

1、使用优先队列(最小堆)

伪代码:

DIJKSTRA(G, s)dist[s] <- 0prev[s] <- NULLfor each vertex v in G.V - {s}dist[v] <- INFINITYprev[v] <- NULLQ <- priority queue containing all vertices in G.V with dist as keywhile Q is not emptyu <- Q.extractMin()for each vertex v in G.Adj[u]if dist[u] + G.w(u, v) < dist[v]dist[v] <- dist[u] + G.w(u, v)prev[v] <- uQ.decreaseKey(v, dist[v])return dist[], prev[]
2、朴素法(简单数组) 

伪代码:

DIJKSTRA(G, s)dist[s] <- 0prev[s] <- NULLfor each vertex v in G.V - {s}dist[v] <- INFINITYprev[v] <- NULLwhile there are unvisited verticesu <- vertex with min dist[u] among unvisited verticesmark u as visitedfor each vertex v in G.Adj[u]if dist[u] + G.w(u, v) < dist[v]dist[v] <- dist[u] + G.w(u, v)prev[v] <- ureturn dist[], prev[]

二、经典例题

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

题目链接

47. 参加科学大会(第六期模拟笔试) (kamacoder.com)

题目描述

小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。

小明的起点是第一个车站,终点是最后一个车站。然而,途中的各个车站之间的道路状况、交通拥堵程度以及可能的自然因素(如天气变化)等不同,这些因素都会影响每条路径的通行时间。

小明希望能选择一条花费时间最少的路线,以确保他能够尽快到达目的地。

输入描述

第一行包含两个正整数,第一个正整数 N 表示一共有 N 个公共汽车站,第二个正整数 M 表示有 M 条公路。 

接下来为 M 行,每行包括三个整数,S、E 和 V,代表了从 S 车站可以单向直达 E 车站,并且需要花费 V 单位的时间。

输出描述

输出一个整数,代表小明从起点到终点所花费的最小时间。

输入示例

7 9
1 2 1
1 3 4
2 3 2
2 4 5
3 4 2
4 5 3
2 6 4
5 7 4
6 7 9

输出示例

12

提示信息

能够到达的情况:

如下图所示,起始车站为 1 号车站,终点车站为 7 号车站,绿色路线为最短的路线,路线总长度为 12,则输出 12。

不能到达的情况:

如下图所示,当从起始车站不能到达终点车站时,则输出 -1。

数据范围:

1 <= N <= 500;
1 <= M <= 5000;

题解:朴素Dijkstra

注意:Dijkstra算法适用于没有负权重边的有向图。如果图中存在负权重边,则应该使用Bellman-Ford算法。

本题思路如下:

初始化图:创建一个邻接矩阵grid,大小为n+1xn+1,所有值初始化为INT_MAX。创建一个数组minDist,大小为n+1,所有值初始化为INT_MAX,除了start顶点,其值为0。创建一个数组visited,大小为n+1,所有值初始化为false。读取边信息:对于m次循环:读取p1, p2, val。在grid中设置grid[p1][p2] = val。Dijkstra算法:初始化cur为-1,minVal为INT_MAX。对于i从1到n:找到未访问顶点中距离源点最近的顶点cur,更新minVal。如果cur为-1,退出循环。标记cur为已访问。对于v从1到n:如果v未被访问且grid[cur][v]不为INT_MAX:如果minDist[cur] + grid[cur][v] < minDist[v],则更新minDist[v]。输出结果:如果minDist[end]为INT_MAX,则输出-1。否则,输出minDist[end]。

基于以上思路,完整实现代码:

#include <bits/stdc++.h>
using namespace std;int main()
{int n, m; // n为顶点数,m为边数cin >> n >> m;// 使用邻接矩阵表示图:顶点从1到n,初始化为无穷大(INT_MAX)vector<vector<int>> grid(n + 1, vector<int>(n + 1, INT_MAX));// 读取图的边信息for (int i = 0; i < m; i++){int p1, p2, val;cin >> p1 >> p2 >> val;// 由于是有向图,只需要设置一个方向的权重grid[p1][p2] = val;}int start = 1; // 起始顶点int end = n;   // 终止顶点// 初始化最短距离数组,所有顶点到源点的距离都设置为无穷大(除了源点本身)vector<int> minDist(n + 1, INT_MAX);minDist[start] = 0; // 源点到自身的距离为0// 标记数组:标记顶点是否已访问 - 初始化为未访问vector<bool> visited(n + 1, false);// Dijkstra算法主循环,遍历所有顶点for (int i = 1; i <= n; i++){int minVal = INT_MAX; // 初始化当前最小距离为无穷大int cur = -1;         // 初始化当前顶点为 -1// 找到未访问顶点中距离源点最近的顶点for (int v = 1; v <= n; ++v){if (!visited[v] && minDist[v] < minVal){minVal = minDist[v]; // 更新最小距离cur = v;             // 更新当前顶点}}if (cur == -1) // 如果没有找到这样的顶点,退出循环break;visited[cur] = true; // 标记该顶点已访问// 更新相邻顶点的最短距离for (int v = 1; v <= n; v++){if (!visited[v] && grid[cur][v] != INT_MAX){// 如果当前顶点到v顶点的距离加上当前顶点到源点的距离小于v顶点到源点的距离,则更新if (minDist[cur] + grid[cur][v] < minDist[v])minDist[v] = minDist[cur] + grid[cur][v];}}}// 输出结果,如果到end顶点的距离仍然是无穷大,则说明无法到达if (minDist[end] == INT_MAX)cout << -1 << endl;elsecout << minDist[end] << endl; // 输出最短路径长度
}

本题是针对有向图,故对于每条边只需要存储单方向的信息;如果是无向图,就需要改进为双向处理,即:

grid[p1][p2] = val;
grid[p2][p1] = val;

 三、小结

后边打卡会在此之后补充优化后的Dijkstra算法,即使用优先队列(最小堆)的方式。今天的打卡到此结束,后边会继续加油!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

AI论文写作测评!类似茅茅虫论文写作助手网站

在当前的学术研究和写作环境中&#xff0c;AI论文写作助手成为了许多学者和学生的重要工具。其中&#xff0c;千笔-AIPassPaper和茅茅虫论文写作助手是两款备受关注的平台。本文将对这两款工具进行详细测评&#xff0c;并推荐适合不同需求的用户使用。 千笔-AIPassPaper AI论文…

实现领域驱动设计(DDD)系列详解:限界上下文

随着微服务的兴起&#xff0c;限界上下文更是被拔高到战略设计的核心地位&#xff0c;也成了连接问题空间与解空间的重要桥梁&#xff0c;但不可否认&#xff0c;一方面&#xff0c;领域驱动设计社区纷纷发声强调它的重要性&#xff1b;另一方面&#xff0c;还有很多人依旧弄不…

游戏算法专题之PRD算法:听说你想凭运气抽中荣耀水晶?

PRD算法全称Pseudo-Random Distribution。是概率分布中的一种常见算法&#xff0c;在游戏开发领域中很常用。 PRD用于控制随机事件的触发概率&#xff0c;使其表现得更加符合预期&#xff0c;相比于传统得随机数生成&#xff0c;PRD算法可以平滑得控制随机事件的触发次数&…

计算机毕业设计 二手闲置交易系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

什么是快充协议,最常见的快充协议有哪些

什么是快充协议 随着手机快充的出现大家都知道快充技术但很多人确不知道快充协议&#xff0c;在快充技术里快充协议是必不可少的&#xff0c;那么今天我们就来探讨一下什么是快充协议&#xff1f; 快充协议是一种通过提高充电效率来缩短设备充电时间的电池充电技术。它通过在充…

主播和礼品检测系统源码分享

主播和礼品检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

约瑟夫环和一元多项式修正版

这里先附上上一篇博文的链接大家可以对比着看&#xff0c;错误已经改正https://blog.csdn.net/2302_78946488/article/details/141751514?spm1001.2014.3001.5501 约瑟夫环 以下是详细代码 //约瑟夫环 #include<stdio.h> #include<stdlib.h> //建立链表结点 str…

【Unity】 HTFramework框架(五十六)MarkdownText:支持运行时解析并显示Markdown文本

更新日期&#xff1a;2024年9月15日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 MarkdownText支持的Markdown语法标题强调文本表格嵌入图像超链接 使用MarkdownText设置项运行时属性解析使用ID模式嵌入图像 MarkdownText MarkdownText…

句子成分——每日一划(八)

目录 一、原句 二、第一部分 三、第二部分 一、原句 In class society everyone lives as a member of a particular class, and every kind of thinking, without exception, is stamped with the brand of a class. 来源&#xff1a;二、阶级和阶级斗争 二、第一部分 In…

QT添加图标标题和打包项目

QT项目打包 项目的标题和图标标题项目图标exe图标 可执行文件——生成exeexe运行报错“找不到qt6gui.dll”等 相关库文件——生成zip安装包打包程序——生成exe安装包 项目的标题和图标 项目打包要好看点&#xff0c;得有个好点的标题和图标&#xff0c;这次打包的项目是我上一…

图论篇--代码随想录算法训练营第五十八天打卡|拓扑排序,dijkstra(朴素版),dijkstra(堆优化版)精讲

拓扑排序 题目链接&#xff1a;117. 软件构建 题目描述&#xff1a; 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文件编号从 0 到 N - 1&#xff0c;在这些文件中&#xff0c;某些文件依赖于其他文件的内容&#xff0c;这意味着如果文件 A 依赖于文件 B&#xff0…

【移动端】菜单的自动展开与收回

前言 为了满足手机上菜单栏随用户移动&#xff0c;菜单的自动展示与隐藏&#xff0c;特此记录 基本原理 实现逻辑 window.addEventListener(‘scroll’, debouncedScrollHandler) – 监听文档视图滚动事件 document.querySelector(‘.header’) – 选择器匹配元素 创建show和h…

中断门+陷阱门

中断门&#xff1a; 中断描述符在IDT表里面 kd> dq idtr 80b95400 83e48e000008bfc0 83e48e000008c150 80b95410 0000850000580000 83e4ee000008c5c0 80b95420 83e4ee000008c748 83e48e000008c8a8 80b95430 83e48e000008ca1c 83e48e000008d018 80b95440 000085000050…

Tuxera NTFS for Mac 2023绿色版

​ 在数字化时代&#xff0c;数据的存储和传输变得至关重要。Mac用户经常需要在Windows NTFS格式的移动硬盘上进行读写操作&#xff0c;然而&#xff0c;由于MacOS系统默认不支持NTFS的写操作&#xff0c;这就需要我们寻找一款高效的读写软件。Tuxera NTFS for Mac 2023便是其中…

Redis入门2

在java中操作Redis Redis的Java客户端 Redis 的 Java 客户端很多&#xff0c;常用的几种: Jedis Lettuce Spring Data Redis Spring Data Redis 是 Spring 的一部分&#xff0c;对 Redis 底层开发包进行了高度封装。 在 Spring 项目中&#xff0c;可以使用Spring Data R…

DTU远程控制:空巢老人的智慧灌溉方案

我是老刘&#xff0c;大家经常这样唤我。在浙江省台州市下面的一个小乡村里&#xff0c;我经营着一家工厂。 说起台州&#xff0c;是个好地方&#xff0c;这里有一座天台山&#xff0c;就是“一座天台山&#xff0c;半步全唐诗”的那座山&#xff0c;山里有一个大瀑布&#xf…

计算机毕业设计 乡村生活垃圾管理系统的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

STM32(十四):USART串口数据包

HEX数据包 0xFF包头&#xff0c;0xFE包尾。 如果数据和包头包尾重复&#xff0c;可能会引起误判。 解决办法&#xff1a; 1. 限制载荷数据的范围 2. 如果无法避免载荷数据和包头包尾重复&#xff0c;就使用尽量使用固定长度数据包。 包头 ‘\r\n 包尾 在载荷数据中间可以出现…

用nginx-rtmp-win32-master及ffmpeg模拟rtmp视频流

效果 使用nginx-rtmp-win32-master搭建RTMP服务 双击exe就可以了。切记整个目录不能有中文 README.md ,启用后本地的RTM路径: rtmp://192.168.1.186/live/xxx ffmpeg将地本地视频推RMTP F:\rtsp\ffmpeg-7.0.2-essentials_build\bin>ffmpeg -re -i F:\rtsp\123.mp4 -c c…

分贝转换 1 mVpp = 9.03dBmV

分贝转换 1 mVpp 9.03dBmV 函数发生器调节如下参数在频谱仪器上能看到9.03dBmv的电压值函数发生器产生 30mVpp 频谱仪会显示多少dBmV 函数发生器调节如下参数 输出频率&#xff1a;10 MHz 波形类型&#xff1a;正弦波 阻抗&#xff1a;50 Ω 幅度&#xff1a;1 mVpp …