代码随想录算法训练营第五十九天 | dijkstra(堆优化版)精讲

目录

dijkstra(堆优化版)精讲

思路

堆优化细节

方法一: 最小堆优化


dijkstra(堆优化版)精讲

  • 题目链接:卡码网:47. 参加科学大会
  • 文章讲解:代码随想录 

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

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

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

【输入描述】

第一行包含两个正整数,第一个正整数 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 三部曲:

  1. 第一步,选源点到哪个节点近且该节点未被访问过
  2. 第二步,该最近节点被标记访问过
  3. 第三步,更新非访问节点到源点的距离(即更新minDist数组)

只不过之前是 通过遍历节点来遍历边,通过两层for循环来寻找距离源点最近节点。 这次我们直接遍历边,且通过堆来对边进行排序,达到直接选择距离源点最近节点。

先来看一下针对这三部曲,如果用 堆来优化。

那么三部曲中的第一步(选源点到哪个节点近且该节点未被访问过),我们如何选?

我们要选择距离源点近的节点(即:该边的权值最小),所以 我们需要一个 小顶堆 来帮我们对边的权值排序,每次从小顶堆堆顶 取边就是权值最小的边。

pq中中为什么要存 源点到该节点的权值,因为 这个小顶堆需要按照权值来排序)

有了小顶堆自动对边的权值排序,那我们只需要直接从 堆里取堆顶元素(小顶堆中,最小的权值在上面),就可以取到离源点最近的节点了 (未访问过的节点,不会加到堆里进行排序)

所以三部曲中的第一步,我们不用 for循环去遍历,直接取堆顶元素:

# 1. 第一步,选源点到哪个节点近且该节点未被访问过 (通过优先级队列来实现)
# 节点, 源点到该节点的距离
cur_dict,cur_node = heapq.heappop(pq)

第二步(该最近节点被标记访问过) 这个就是将 节点做访问标记,和 朴素dijkstra 一样 ,代码如下:

# 2. 第二步,该最近节点被标记访问过
visited[cur_node] = True

cur.first 是指取 pair<int, int> 里的第一个int,即节点编号 )

第三步(更新非访问节点到源点的距离),这里的思路 也是 和朴素dijkstra一样的。

但很多录友对这里是最懵的,主要是因为两点:

  • 没有理解透彻 dijkstra 的思路
  • 没有理解 邻接表的表达方式

我们来回顾一下 朴素dijkstra 在这一步的代码和思路(如果没看过我讲解的朴素版dijkstra,这里会看不懂)

# 3、第三步,更新非访问节点到源点的距离(即更新minDist数组)
for j in range(1,n+1):if not visited[j] and graph[cur][j] != float('inf') and graph[cur][j] + minDist[cur] < minDist[j]:minDist[j] = minDist[cur] + graph[cur][j]

其中 for循环是用来做什么的? 是为了 找到 节点cur 链接指向了哪些节点,因为使用邻接矩阵的表达方式 所以把所有节点遍历一遍。

而在邻接表中,我们可以以相对高效的方式知道一个节点链接指向哪些节点。

所以在邻接表中,我们要获取 节点cur 链接指向哪些节点,就是遍历 graph[cur节点编号] 这个链表。

接下来就是更新 非访问节点到源点的距离,代码实现和 朴素dijkstra 是一样的,代码如下:

for edge in edges[cur_node]:if not visited[edge.to] and cur_dict + edge.val < minDist[edge.to]:minDist[edge.to] = cur_dict + edge.valheapq.heappush(pq,(minDist[edge.to],edge.to))

方法一: 最小堆优化

import heapq
import sys
class Edge:def __init__(self,to,val) -> None:self.to = to self.val = valdef dijkstra(edges,n,start,end):visited = [False] * (n+1)minDist = [float('inf')] * (n+1)minDist[start] = 0pq = []heapq.heappush(pq,(0,start))while pq:cur_dict,cur_node = heapq.heappop(pq)if visited[cur_node]:continuevisited[cur_node] = Truefor edge in edges[cur_node]:if not visited[edge.to] and cur_dict + edge.val < minDist[edge.to]:minDist[edge.to] = cur_dict + edge.valheapq.heappush(pq,(minDist[edge.to],edge.to))return -1 if minDist[end] == float('inf') else minDist[end]
if __name__=="__main__":input = sys.stdin.readdata = input().split()# n个车站,m条公路n = int(data[0])m = int(data[1])edges = [[] for i in range(n+1)]index = 2for i in range(m):start = int(data[index])to = int(data[index+1])val = int(data[index+2])edges[start].append(Edge(to,val))index += 3res = dijkstra(edges,n,start=1,end=n)print(res)

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

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

相关文章

Git常用命令与基本操作(包括搭建git环境)

首先&#xff0c;在github注册邮箱&#xff0c;然后再Ubuntu下安装git和ssh服务&#xff08;如果实在windows下需要下载git bash&#xff0c;其余操作与Ubuntu相同&#xff09;。 Ubuntu搭建git环境 ssh-keygen -t rsa -C "注册账号的邮箱名字" 生成SSH通信用的公钥…

Snowflake 如何通过 Apache Iceberg 和 Polaris 为大数据的未来提供动力

Snowflake 的使命是让每个组织都成为数据驱动型组织。凭借围绕 Apache Iceberg 的最新创新和 Polaris 的推出,这家数据云公司使开发人员、工程师和架构师能够比以往任何时候都更快、更轻松地利用大数据获得变革性的业务见解。 将开放标准引入数据云 Snowflake 战略的核心是采…

Elasticsearch知识点整理

数据分类 非结构化数据 全文数据。不定长或无固定格式 报错xml,HTML,Word结构化数据 行数据&#xff0c;由二维表结构来逻辑表达和实现的数据 非结构化数据 对于非结构化的数据 搜索主要有两种方法 顺序扫描全文检索 顺序扫描 一般不建议这么做。例如给你一张报纸&…

WEB攻防-PHP特性缺陷对比函数CTF考点CMS审计实例

知识点&#xff1a; 1、过滤函数缺陷绕过&#xff1b; 2、CTF考点与代码审计&#xff1b; 1、赋值 不会对比类型 类型也会对比 2、MD5 在使用比较md5的时候&#xff0c;只要第一位是相等的数字&#xff0c;则会值相等 3、intval 3、 %0a代表换行 4、 6、 7、 代码审计

STM32+ESP01连接到机智云

机智云,全球领先的智能硬件软件自助开发及物联网(iot)云服务平台。机智云平台为开发者提供了自助式智能硬件开发工具与开放的云端服务。通过傻瓜化的自助工具、完善的SDK与API服务能力最大限度降低了物联网硬件开发的技术门槛&#xff0c;降低开发者的研发成本&#xff0c;提升…

SQL Server性能优化之读写分离

理论部分: 数据库读写分离&#xff1a; 主库&#xff1a;负责数据库操作增删改 20% 多个从库&#xff1a;负责数据库查询操作 80% 读写分离的四种模式 1.快照发布&#xff1a;发布服务器按照预定的时间间隔向订阅服务器发送已发布的数据快照 2.事务发布[比较主流常见]&#xf…

【Docker Nexus3】maven 私库

1.部署环境 window 11 x64Docker Desktop 4.34.1 (166053) Docker Engine v27.2.0 1.1.Docker 镜像源 1.1.1.Docker Engine 配置 {"builder": {"features": {"buildkit": true},"gc": {"defaultKeepStorage": "32…

Windows 的 docker 删除容器后 WSL2 磁盘空间不释放的问题

1&#xff1a;Windows 的 docker 删除容器后 WSL2 磁盘空间不释放的问题&#xff0c;成功搞定 见这里的文章&#xff1a; https://blog.csdn.net/ppppppppila/article/details/139653675 2&#xff1a; 重装Docker desktop 或者 当打开Docker Desktop时候&#xff0c;启动dock…

【Arduino】BNO085 姿态的 3D模型 展示方法(映射到 Unity)

总览 1.arduino 代码和库等… 2.Unity 的部分&#xff0c;创建一个 3D 工程&#xff0c;然后创建一个 cube&#xff0c;绑定一个脚本文件 3.效果预览&#xff1a; 【Arduino】BNO085 姿态的 3D模型 展示方法&#xff08;映射到 Unity&#xff09; 一、Arduino 部分 1.使用的…

机器学习和深度学习的常见概念总结(多原创图)

目录 使用说明一、未分类损失函数&#xff08;Loss Function&#xff09;1. **损失函数的作用**2. **常见的损失函数**2.1. **均方误差&#xff08;MSE, Mean Squared Error&#xff09;**2.2. **均方根误差&#xff08;RMSE, Root Mean Squared Error&#xff09;**2.3. **平均…

django-admin自定义功能按钮样式

位置在原来的django-admin 栏中的上方【会因为屏幕大小而变换位置】 <!-- 这里是不会替换掉旧的 添加按钮 &#xff0c;而是添加多一个按钮【点击Crawl Data】--> <!-- /home/luichun/lc/Pyfile/Pywebback/app/paqu/templates/admin/yourmodel_changelist.html -->…

游戏爱好者离不开的录屏工具大赏

你用过录屏工具吗&#xff1f;我在做展示方案或者远程会议的时候经常会用到录屏工具。如果你也有录屏的需求那就接着往下看吧。这篇文章我将介绍几款简单教会我们怎么录屏的工具。 1.福昕录屏大师 链接达达&#xff1a;www.foxitsoftware.cn/REC/ 这个软件的操作极为简便。它…

打包部署若依(RuoYi)SpringBoot后端和Vue前端图文教程

打包后端‘ 1&#xff0c;打开若依&#xff0c;点击右侧的Maven展开Maven管理&#xff0c;选择ruoyi>Lifecycle 先双击clean清除原本启动项目时生成的文件。然后点击package等待项目打包&#xff0c;切记要取消运行再打包 打包完成后会在ruoyi-admin>src>target里面…

Axure RP 11 Beta 测试版 发布了,目前是免费试用阶段

Axure RP 11 Beta 已经发布上线了&#xff01;各位产品同学可以从下面的链接下载测试版&#xff0c;体验新功能。目前RP11处于免费试用阶段&#xff0c;没有授权的用户也可以免费使用试用版。 与 Axure RP 的以往版本一样&#xff0c;在 RP11 中保存文件后&#xff0c;无法在低…

cityengine修改纹理创建模型

数据准备 1、建筑shp面数据 2、安装好cityengine软件 3、Arcgis(非必要) 效果 1、新建工程 路径不要放C盘下 2、复制规则文件和纹理 安装软件后,这些素材在电脑上能找到,默认位置是:C:\Users{计算机名}\Documents\CityEngine\Default Workspace\ESRI.lib,如果找不到…

FP7208+FP5207:升压芯片在太阳能灯串中的应用方案

太阳能灯串是一种利用太阳能发电的高效照明装置&#xff0c;由多个太阳能灯泡串联而成。相比传统的电网供电照明设备&#xff0c;太阳能灯串具有无需外部电源、环保节能、安全可靠等优势&#xff0c;受到越来越多人的追捧和使用。 下面&#xff0c;鱼子酱将为大家介绍一套完整…

分析图形学示例报告

一、实验任务 二、主要功能模块 三、代码 //自定义坐标系模块 CDC* pDC GetDC();//获得设备上下文 CRect rect;//定义矩形 GetClientRect(&rect);//获得矩形客户去大小 pDC->SetMapMode(MM_ANISOTROPIC);//自定义坐标系 pDC->SetWindowExt(rect.Width()/4, rect.He…

深度学习-13-小语言模型之SmolLM的使用

文章附录 1 SmolLM概述1.1 SmolLM简介1.2 下载模型2 运行2.1 在CPU/GPU/多 GPU上运行模型2.2 使用torch.bfloat162.3 通过位和字节的量化版本3 应用示例4 问题及解决4.1 attention_mask和pad_token_id报错4.2 max_new_tokens=205 参考附录1 SmolLM概述 1.1 SmolLM简介 SmolLM…

白话:大型语言模型中的幻觉(Hallucinations)

大型语言模型&#xff08;LLM&#xff09;可是自然语言处理和人工智能的一大步。它们能做的事情可多了&#xff0c;比如生成听起来挺靠谱的文本&#xff0c;翻译语言&#xff0c;总结文档&#xff0c;甚至写诗。但你知道吗&#xff0c;这些模型有时候会出现 “幻觉&#xff08;…

idea。正则

正则替换&#xff0c;$ 变量保持不变 to_char(O.CREATED_TIME,"yyyy-MM-dd HH24:m1:ss) aS CREATED_TIME date format(O.CREATED TIME, %Y-%m-%d %H:%6i:%6s) aS CREATED_TIME. 本次正则的目标是&#xff1a;to_char 》date format 以及"yyyy-MM-dd HH24:m1:ss替换…