最短路径专题2 Dijkstra 最短距离(堆优化版)

news2024/11/22 9:45:50

题目:样例:

输入
6 6 0
0 1 2
0 2 5
0 3 1
2 3 2
1 2 1
4 5 1

输出
0 2 3 1 -1 -1

思路:

        根据题意,数据范围也小,也可以用朴素版的Dijsktra来做,朴素版的Dijsktra我做过了一遍了,可以看以一下我之前写的。

        这次用堆优化,有时候数据范围大那么一点点的时候比如数据范围是

的时候,最坏情况下,朴素版的Dijsktra的时间复杂度是(1.5 * 10^5)^2,就会超时。

如果我们通过提前排序知道哪个路径是最短路的点,即去掉一层循环,时间复杂度就是1.5 * 10^5,这样不会超时,就需要用到 堆来排序我们每个点最短距离,并且该点如果到达过,就寻找下一个最短路径的,由于数据范围较大,用不了了邻接矩阵的方式,我们只能用邻接表来实现了。

代码详解如下:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <unordered_map>
#define endl '\n'
#define mk make_pair
#define x first
#define y second
#define int long long
#define YES puts("YES")
#define NO puts("NO")
#define umap unordered_map
#define INF 0x3f3f3f3f3f3f3f
#define All(x) (x).begin(),(x).end()
#pragma GCC optimize(3,"Ofast","inline")
#define ___G std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;

// 存储 点与路径长度
using PII = pair<int,int>;

int n,m,s;

int dist[N];	// 记录对应点的最短路
bool st[N];		// 标记该点是否走到过

// 数组模拟邻接表,更有效率
int h[N],e[N],w[N],ne[N],idx;
inline void Add(int a,int b,int c)
{
	e[idx] = b,w[idx] = c,ne[idx] = h[a],h[a] = idx++;
}

inline void Dijkstra()
{
	// 初始化 最短路
	memset(dist,INF,sizeof dist);
	// 初始化起点最短路距离是 0
	dist[s] = 0;
	
	// 建立存储的 堆,根据小根堆的 小到大排序
	priority_queue<PII,vector<PII>,greater<PII>>q;
	
	// 这里小根堆的小到大排序规则,
	// 所以我们需要距离小的排前面,点放在后面
	q.push(mk(0,s));
	
	// 这里有一点点类似 BFS 做法
	while(q.size())
	{
		// 取出我们对应最短距离需要更新的堆组合
		auto now = q.top();
		q.pop();
		
		int a = now.y;	// 取出对应的点
		int distence = now.x;	// 取出对应的最短距离
		
		if(st[a]) continue;		// 如果我们点走动过,就不用更新走动了
		
		st[a] = true;	// 标记当前走动更新的点
		
		// 更新该点的 dist
		for(int i = h[a];i != -1;i = ne[i])
		{
			int j = e[i];	// 取出对应点的关系
			
			// 如果该点j的距离 比 a 点到 j 点的距离还要大,那么更新最短路径距离
			if(dist[j] > distence + w[i]) dist[j] = distence + w[i];
			
			// 存储对应距离和对应点,方便下一次更新
			q.push(mk(dist[j],j));
		}
	}
	return ;
}

inline void solve()
{
	// 链表初始化
	memset(h,-1,sizeof h);
	
	cin >> n >> m >> s;
	while(m--)
	{
		int a,b,c;
		cin >> a >> b >> c;
		
		// 添加链表,记录两点之间的距离
		Add(a,b,c);
		Add(b,a,c);
	}
	
	// 求最短路
	Dijkstra();
	
	// 输出各点的所得最短距离
	for(int i = 0;i < n;++i)
	{
		if(i)cout << ' ';
		if(dist[i] >= INF) cout << -1;
		else cout << dist[i];
	}
}

signed main()
{
//	freopen("a.txt", "r", stdin);
	___G;
	int _t = 1;
//	cin >> _t;
	while (_t--)
	{
		solve();
	}

	return 0;
}

最后提交:

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

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

相关文章

【统计学】Top-down自上而下的角度模型召回率recall,精确率precision,特异性specificity,模型评价

最近在学 logistic regression model&#xff0c;又遇见了几个之前的老面孔。 召回率recall, 精确率precision&#xff0c;特异性spcificity&#xff0c;准确率accuracy&#xff0c;True positive rate&#xff0c;false positive rate等等名词在学习之初遇到的困难在于&#x…

Vue3最佳实践 第六章 Pinia,Vuex与axios,VueUse 2(Vuex)

Vuex 状态管理 Vuex 是一种集中管理所有组件中数据的机制。它和Pinia一样都是解决使用 props 和 $emit 事件在组件之间传递数据时&#xff0c;当组件之间频繁传递&#xff0c;层级增加时管理数据就变得困难。Vue 的官方状态管理库已更改为Pinia&#xff0c;Pinia 具有与 Vue 几…

微信小程序-1

微信开发文档 https://developers.weixin.qq.com/miniprogram/dev/framework/ 报错在调试器的console里找 一、结构 Ctrl 放大字体 Ctrl - 缩小 设置 - - - 外观设置 - - - 可以修改喜欢的主题颜色 index.js index.json index.wxml 》 html <view class"box&qu…

【kubernetes】kubernetes中的StatefulSet使用

TOC 1 为什么需要StatefulSet 常规的应用通常使用Deployment&#xff0c;如果需要在所有机器上部署则使用DaemonSet&#xff0c;但是有这样一类应用&#xff0c;它们在运行时需要存储一些数据&#xff0c;并且当Pod在其它节点上重建时也希望这些数据能够在重建后的Pod上获取&…

Python爬虫案例入门教程(纯小白向)——夜读书屋小说

Python爬虫案例——夜读书屋小说 前言 如果你是python小白并且对爬虫有着浓厚的兴趣&#xff0c;但是面对网上错综复杂的实战案例看也看不懂&#xff0c;那么你可以尝试阅读我的文章&#xff0c;我也是从零基础python开始学习爬虫&#xff0c;非常清楚在过程中所遇到的困难&am…

字符编码的了解

前言&#xff1a; 在编写文件读取功能的过程中&#xff0c;我遭遇了一个棘手的乱码难题。经过细致的排查&#xff0c;发现这一问题的根源在于文件的字符编码。为了帮助大家有效地克服编码差异所带来的开发挑战&#xff0c;因此&#xff0c;我收集了字符集编码的相关知识&#x…

想要精通算法和SQL的成长之路 - 旋转链表

想要精通算法和SQL的成长之路 - 旋转链表 前言一. 旋转链表 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 旋转链表 原题链接 由于k的大小可能超过链表长度&#xff0c;因此我们需要根据链表长度取模。那么我们首先需要去计算链表的长度是多少&#xff1a; if (head …

C# GraphicsPath 类学习

先在窗体放2个picturebox&#xff0c; 然后看一下如下代码&#xff1b; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; us…

Pytorch基础:Tensor的transpose方法

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 在Pytorch中&#xff0c;transpose是Tensor的一个重要方法&#xff0c;同时它也是一个torch模块中的一个函数&#xff0c;它们的语法如下所示。 Tensor.transpo…

window安装压缩版postgresql

环境&#xff1a; window 11 专业版postgresql-16.0-1-windows-x64-binaries.zip 一、下载 1.1 从官网下载 https://www.postgresql.org/download/windows/ 1.2 从百度网盘下载 链接&#xff1a;https://pan.baidu.com/s/1fmQbgWSzX4hN07Lgdzfz0g?pwddzyy 提取码&#…

汇编语言王爽第4版实验8答案(和你想的不一样)

实验8 分析一个奇怪的程序 E:\mywork\asm\p906.asm C:\>edit p906.asm assume cs:codecode segmentmov ax,4c00hint 21h start: mov ax,0 s:nop ; nop的机器码占一个字节nopmov di, offset smov si, offset s2mov ax, cs:[si]mov cs:[di],ax s0:jmp short s s1:mov ax,0in…

tauri为窗口添加阴影效果

需求 为窗口添加阴影效果&#xff0c;让窗口显得更立体。 实现方案 通过 tauri 中的 window-shadows 依赖实现。 编码 修改 label 标签内容 修改 src-tauri/tauri.conf.json 文件&#xff0c;设置 label 字段为 “customization” 增加shadows的依赖 修改 src-tauri…

第8期ThreadX视频教程:应用实战,将裸机工程移植到RTOS的任务划分,驱动和应用层交互,中断DMA,C库和中间件处理等注意事项

视频教程汇总帖&#xff1a;【学以致用&#xff0c;授人以渔】2023视频教程汇总&#xff0c;DSP第12期&#xff0c;ThreadX第8期&#xff0c;BSP驱动第26期&#xff0c;USB实战第5期&#xff0c;GUI实战第3期&#xff08;2023-10-01&#xff09; - STM32F429 - 硬汉嵌入式论坛 …

函数、函数的傅里叶级数展开、傅里叶级数的和函数之间的关系

1.函数、函数的傅里叶级数展开、傅里叶级数的和函数之间的关系 1.1 傅里叶级数中的系数公式推导 我们先来推导一下傅里叶级数中的系数公式&#xff0c;其实笔者已经写过一篇相关笔记&#xff0c;详见&#xff1a;为什么要把一个函数分解成三角函数?(傅利叶级数) f ( x )…

MySQL 索引优化实践(单表)

目录 一、前言二、表数据准备三、常见业务无索引查询耗时测试3.1、通过订单ID / 订单编号 查询指定订单3.2、查询订单列表 四、订单常见业务索引优化实践4.1、通过唯一索引和普通索引优化通过订单编号查询订单信息4.2、通过普通联合索引优化订单列表查询4.2.1、分析查询字段的查…

【数据结构】HashSet的底层数据结构

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 HashSet 一、 HashSet 集合的底层数据结构二…

GraphPad Prism 10 for Mac(统计分析绘图软件)

GraphPad Prism是一款专业的统计和绘图软件&#xff0c;主要用于生物医学研究、实验设计和数据分析。 以下是 GraphPad Prism 的主要功能和特点&#xff1a; 数据导入和整理&#xff1a;GraphPad Prism 可以导入各种数据格式&#xff0c;并提供直观的界面用于整理、编辑和管理数…

RFID与人工智能的融合:物联网时代的智能化变革

随着物联网技术的不断发展&#xff0c;现实世界与数字世界的桥梁已经被打通。物联网通过各种传感器&#xff0c;将现实世界中的光、电、热等信号转化为有价值的数据。这些数据可以通过RFID技术进行自动收集和传输&#xff0c;然后经由人工智能算法进行分析、建模和预测&#xf…

【LeetCode算法系列题解】第76~80题

CONTENTS LeetCode 76. 最小覆盖子串&#xff08;困难&#xff09;LeetCode 77. 组合&#xff08;中等&#xff09;LeetCode 78. 子集&#xff08;中等&#xff09;LeetCode 79. 单词搜索&#xff08;中等&#xff09; LeetCode 76. 最小覆盖子串&#xff08;困难&#xff09; …

Java下正面解除警告Unchecked cast: ‘java.lang.Object‘ to ‘java.util.ArrayList‘

就是我在反序列化时&#xff0c;遇到这样一个警告&#xff1a; Unchecked cast: java.lang.Object to java.util.ArrayList<com.work1.Student>然后我去网上查&#xff0c;有些人说用SuppressWarnings(“unchecked”)去忽略警告&#xff0c;但是我觉得作为一名合格的程序…