最短路模板:使用priority_queue实现的Dijkstra算法

Dijkstra 算法-利用优先队列Priority Queue实现的Lazy版本 Dijkstra 算法, 优先队列实现 阅读详情

测试数据:

8 15
4 5 0.35
5 4 0.35
4 7 0.37
5 7 0.28
7 5 0.28
5 1 0.32
0 4 0.38
0 2 0.26
7 3 0.39
1 3 0.29
2 7 0.34
6 2 0.40
3 6 0.52
6 0 0.58
6 4 0.93

测试结果:

1 1.05
2 0.26
3 0.99
4 0.38
5 0.73
6 1.51
7 0.60


PS:边的权重必须非负。

PS2:就算有平行边和自环也请方向使用。


代码:

#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<utility>
#include<functional>
using namespace std;
const int mx = 10005;

typedef pair<double, int> P; ///first是最短距离,second是顶点编号
struct edge
{
	double cost;
	int to;
	void read()
	{
		scanf("%d%lf", &to, &cost);
	}
} e;

vector<edge> G[mx];
double disTo[mx];
priority_queue<P, vector<P>, greater<P> > pq;

/*
使用:dj(起点)
输出:disTo[目标点]
复杂度:平均情况:O(ElogV),最坏情况:O(ElogV)
*/
void dj(int s)
{
	P p;
	int v, i;
	memset(disTo, 100, sizeof(disTo));
	disTo[s] = 0.0;
	while (!pq.empty()) pq.pop();
	pq.push(P(0.0, s));
	while (!pq.empty())
	{
		p = pq.top(), pq.pop();
		v = p.second; ///v视作e.from
		if (p.first > disTo[v]) continue;
		for (i = 0; i < G[v].size(); ++i)
		{
			e = G[v][i];
			if (disTo[e.to] > disTo[v] + e.cost) ///v视作e.from
			{
				disTo[e.to] = disTo[v] + e.cost;
				pq.push(P(disTo[e.to], e.to));
			}
		}
	}
}

int main()
{
	int n, m, i, a;
	while (~scanf("%d%d", &n, &m))
	{
		for (i = 0; i < n; ++i) G[i].clear();
		while (m--)
		{
			scanf("%d", &a);
			e.read();
			G[a].push_back(e);
		}
		dj(0);
		for (i = 1; i < n; ++i)
			printf("%d %.2f\n", i, disTo[i]);
		putchar(10);
	}
	return 0;
}

PS:O(V^2)复杂度的算法见http://blog.youkuaiyun.com/synapse7/article/details/18253329

PS2:对于有向无环图,有更简单且更快的算法,见http://blog.youkuaiyun.com/synapse7/article/details/19284933


另:若有负权重边,须使用Bellman-Ford算法(基于队列),但这一算法的局限性又在于图中不能存在负权重环

复杂度:平均情况:O(E+V),最坏情况:O(EV)

Dijkstra堆优化(pbds版本priority_queue) 背景 防止赛场上面被卡SPFA,且效率更高更稳定 测试 测试了STL的,和pbds的优先队列,在Dijkstra堆优化中谁更快 对照实验,除了用的容器不同,其余代码段全部一致,保证了只受到STL和pbds影响,都不开O2,都用了快读,用了vector邻接表。 题目链接:洛谷P4779 【模板】单源最短路径(标准版) STL,初始堆中只有一个元素(起点):141-252ms STL,初始堆中有n个元素:238-384ms pbds,初始堆中只有一个元素(起点):62-110ms pbds,初始堆中 阅读详情

相关推荐

Dijkstra算法与城市最短路问题详解

最短路算法是图论中的基础问题,用于求解图中两点间的最短路径。Dijkstra算法作为经典的单源最短路算法,采用贪心策略,通过优先队列实现高效搜索。这类算法在导航系统、物流配送等实际场景中有广泛应用。信息学竞赛中常考察Dijkstra及其变种,同时还需掌握Floyd、Bellman-Ford等其他最短路算法。理解不同算法的原理和适用场景,能帮助开发者根据图结构特点选择最优解法,提升路径规划效率。

weixin_33727510的博客 460

使用priority _queue 对Dijkstra进行优化

对于图的相关算法如最小生成树的Kruskal,Prim算法,最短路径的Dijkstra算法都采用的是贪心算法,而贪心算法最好的辅助工具个人认为就是priority_queue.所以本文将运用priority_queued对算法导论中Dijkstra算法进行优化。对于Dijkstra算法我们先给出算法导论中所给出基本算法实现。 int a[5][5] = { {MAX2,10,M

1748

从模板到原理:Dijkstra算法最短路径与堆优化全解析

图论中,求最短路径是最基础的一类问题,而Dijkstra算法正是解决非负权单源最短路的经典方法。其核心思想源于贪心策略,利用优先队列进行堆优化,可在大规模稀疏图中高效求解。从边权建模到复杂度分析,从朴素实现到堆优化,理解Dijkstra的原理不仅有助于算法选型,还能迁移至地图导航、网络路由等真实场景。这份笔记从原理证明、代码实现、性能对比到踩坑调试,系统呈现了掌握Dijkstra的完整路径,适合希望真正理解并灵活应用该算法的读者。

weixin_29789925的博客 275

使用priority_queue实现Dijkstra

主要是记得传比较算子进去,优先队列要的那个算子参数大概是用来定义优先级的,默认是less,大概是优先级低的先出队。想要从小到大排序要传greater进去。 1 priority_queue< edge,vector<edge>,greater<edge> > Q; 2 Q.push(make_pair(0,1));dis[1]=0; ...

weixin_30535843的博客 300

Dijkstra算法与图论建模:从最短路到网络流实战解析

图论是计算机科学中用于建模网络关系的基础理论,其核心思想是将实体抽象为节点,关系抽象为边。最短路算法是图论中的经典问题,用于在加权图中寻找两点间成本最低的路径,其原理基于贪心或动态规划策略。掌握最短路算法不仅具有算法学习价值,更是解决资源分配、路径优化等工程问题的关键技术。在实际应用中,从物流配送、通信路由到社交网络分析,其底层结构均可抽象为图模型,而寻找最优路径往往是解决问题的第一步。本文以Dijkstra算法为切入点,深入探讨其在处理负权边、多目标优化等复杂场景下的变通方法,并自然延伸到网络流、最小生成

weixin_34110749的博客 452

csp信奥赛C++标准模板库STL(10):priority_queue的使用详解

csp信奥赛C++标准模板库STL(10):priority_queue的使用详解

王老师青少年编程 1322

第十七章 优先队列优化Dijkstra算法

通过画图和代码详解的方式帮助你掌握优先队列优化的dijkstra算法

Turing_Sheep的博客 4432

(ZOS-API)Matlab控制ZEMAX软件调整光学系统某镜面位姿

所用软件的版本:MatlabR2022a, Zemax OpticStudio2024R1交互扩展功能,Zemax和可以同时打开,操作会比较方便在ZEMAX软件中,调整次镜位置通常有两种方法:1.在次镜前后各添加一个坐标间断面,并修改其“偏心X”“偏心Y”等参数来调整次镜的位姿;2.或者直接在次镜属性选项中设置相关数值。这两种方法对Zernike系数的采集结果无显著影响。

ecilifurt的博客 911

单源最短路 Dijkstra 算法 C++高效实现

#include iostream>#include vector>#include using namespace std;typedef vector int> vi;typedef pair int, int> ii;typedef vector ii> vii;typedef vector vii> vvii;const int INF = 0x7FFFFFFF;// 创建一个赋权邻接

Rappy的专栏-火魂の闇狱 4105

EDA工具安装第一步:Synopsys Installer的配置与图形化界面使用详解

本文详细解析了EDA工具安装的关键第一步——Synopsys Installer的配置与使用。文章阐述了其作为统一部署管理器和依赖协调者的核心作用,并分步详解了如何通过图形化界面高效安装EDA工具,同时介绍了命令行批处理等进阶技巧,旨在帮助工程师快速搭建稳定的芯片设计环境。

zeta9的博客 340

龙头复盘神器/复盘于导出工具最新版5.6

龙头复盘神器,复盘于导出工具

初入python踩过的坑 8234

算法刷题笔记 堆优化版的Dijkstra算法求最短路(C++实现。包含详细思路分析和对C++中priority_queue的介绍)

一道较难的算法题,但是仍然属于一道模板题,给出了详细的思路分析,以及对C++中的优先队列的介绍。最后,本文给出了非常详细注释的C++代码实现。

hanmo22357的博客 1777

苹果开发者账号( Apple Developer)登录出现:你的 Apple ID 暂时不符合使用此应用程序的条件(您的apple账户不符合资格)

Apple开发对于新手来说确实可能会遇到各种问题,在遇到 Apple Developer 账号登录问题时,除了检查账号的安全性设置和协议确认外,还需要考虑账号的具体配置问题,比如主邮箱的设置。

Winter_Sun灬的博客 4130

Dijkstra求最短路 II( 最短路 + Dijkstra )

给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为非负值。请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出−1。输入格式第一行包含整数n和m。接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。输出格式输出一个整数,表示1号点到n号点的最短距离。如果路径不存在,则输出−1。数据范围图中涉及边长均不小于0,且不超过10000。数据保证3。...

weixin_63914060的博客 206

eDP/DP接口简介

目前,在视频传输协议以及接口领域,外部接口主要是DP与HDMI两分天下,当然之前出现过很多接口-VGA, DVI等等,最新平台基本以这两个为主;笔记本内部接口就基本上使用eDP((Embedded Display Port))作为标准接口来驱动液晶屏了。那么问题来了,eDP和DP,是完全兼容的么?eDP,DP,HDMI,这三种接口的显示器,可以插在同一个接口上使用么?这篇文章,就会从硬件和一部分协议的角度分析一下这三大协议。

weixin_50518899的博客 2万+

【VisionMaster】图像源模块之本地图像

图像采集之图像源

zhy29563 6958

从“小苯的最短路”看Dijkstra与分层图最短路实战

在算法竞赛与工程实践中,最短路问题是最基础也最常考的一类图论模型。从无权图的BFS到非负权图的堆优化Dijkstra,再到处理负权边的SPFA与Bellman-Ford,算法选型直接决定解题效率与正确性。当题目引入“最多免费k条边”或“k次折扣”等附加状态时,普通单源最短路便升级为带状态的最短路问题。此时,分层图建图技巧成为关键:它通过复制k+1层图,将“使用次数”作为状态维度,把状态转移转化为层间零权边,从而复用Dijkstra完成求解。本文以“小苯的最短路”为引子,深入剖析状态Dijkstra的实现细节

weixin_33806300的博客 201

基于深度学习的三维重建算法——详解与实现

随着深度学习技术的迅猛发展,基于深度学习的三维重建算法在最近几年取得了显著的进展。而基于深度学习的三维重建算法通过利用深度神经网络,能够从大规模数据中学习到更准确、鲁棒的三维结构表示。本文综述了基于深度学习的三维重建算法,并给出了相应的源代码。随着深度学习技术的不断发展,我们相信基于深度学习的三维重建算法将会在未来得到更广泛的应用。实验结果表明,基于深度学习的三维重建算法在准确性和鲁棒性方面取得了显著的提升。以上是关于基于深度学习的三维重建算法的详细介绍与实现,希望对您有所帮助。

CyberGenius的博客 1227

从Dijkstra到分层图:最短路算法与竞赛实战全解析

最短路径是图论中最基础也最实用的模型之一,从单源正权图的Dijkstra堆优化,到处理负权边的Bellman-Ford与SPFA,再到多源Floyd及特殊图的01BFS,算法体系丰富且各有适用场景。理解数据范围与边权性质是正确选型的关键,而松弛操作与优先队列的运用则是实现高效最短路的根基。在竞赛与实际工程中,分层图最短路通过增加状态维度,巧妙解决“最多k次免费/打折”等决策问题,极大拓展了最短路的应用边界。同时,建图方式、初始化细节、内存估算与对拍调试技巧,都是确保代码稳健运行的核心能力。本文从基础概念出发

weixin_34151004的博客 355

华为流程L1-L6业务流程深度细化到可执行【附全文阅读】

该文档主要介绍了华为业务流程的深度细化及相关内容,包括流程框架、建模方法、流程模块描述、流程图建模等,旨在帮助企业构建有效的流程体系,实现战略目标。

cdfunlove的博客 4003

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【模板题】【图】最短路径 经典例题 ——dijkstra+priority_queue

【经典模板】:PID341 / 星门跳跃 题目大意:从1到N有M条边,每条边距离z,求最短路 思路:dijkstra+priority_queue。本道题由于数据非常大,时间要求严,不能全部往队列里丢数据,可以在之前加个判断,本次距离是否减小,减小则往队里扔。此外由于优先队列每次都是选取最小距离,则此距离固定,则代表已访问,标记点下次访问到此点直接跳过。 注意: 1、加判断if(visit...

Always_ease的博客 5508

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C++ STL容器适配器:从Stack、Queue到Priority_queue的设计原理与实战

容器适配器是C++标准模板库中一种重要的设计模式,它通过封装底层容器并提供特定接口,实现了数据结构的灵活复用。其核心原理在于适配器模式,即在不改变原有底层容器结构的基础上,通过限制或转换其操作接口,来满足栈、队列等特定数据结构的抽象需求。这种设计带来了显著的技术价值:它实现了算法与数据结构的解耦,提升了代码的复用性和可配置性,同时遵循了“零开销抽象”原则,在提供高级接口的同时避免了额外的运行时性能损耗。在工程实践中,容器适配器广泛应用于需要后进先出、先进先出或按优先级处理元素的场景,例如函数调用栈、消息队列

weixin_34319374的博客 452

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

priority_queue(优先队列)使用指南

本文系统介绍了C++标准库中的优先队列(priority_queue)容器。优先队列是一种特殊的队列,默认实现大顶堆结构,支持高效插入和删除操作(O(logn)时间复杂度)。文章详细讲解了其定义方式、比较函数(greater/less)的使用方法、自定义类型处理技巧,以及常用成员函数(push/pop/top等)的具体应用。通过多个代码示例展示了优先队列在任务调度、算法实现等场景中的实际应用价值,强调其作为堆数据结构的优势。特别说明了比较函数的反直觉特性和自定义类型需重载比较运算符的要点。

祯的博客 1816

【算法竞赛】堆和 priority_queue

摘要 本文系统介绍了堆数据结构及其在算法竞赛中的应用。首先定义了堆的性质(完全二叉树+极值特性),区分了大/小顶堆。重点讲解了堆的两种核心操作:向上调整(插入元素)和向下调整(删除堆顶),均具有O(logN)时间复杂度。通过数组存储实现堆的模拟,详细展示了插入、删除等操作的代码实现。文章还探讨了堆在优先级队列中的应用,为后续算法学习奠定基础,并提供了丰富的图示和代码示例帮助理解堆的核心机制。

遇见,获得,失去,成长,释怀,完结。我与旧事归于尽,来年依旧迎花开。 722

2024/2/17 图论 最短路入门 dijkstra 1

选2号(因为权值比1到3的小) dist[2]+1<dist[3],所以dist[3]=dist[2]+1。比如这幅图,初始情况下,把所有的dist都设置为inf(也就是无穷大)选1号,更新最近的2,3号点 dist[2]=2,dist[3]=4。选当前离起点最近(权值最小)且没有选过的点,来更新其它点的距离。开一个数组dist,dist[x]表示从起点出发,到x的距离。这两道题只有数据范围的差别,用下面的代码可以一次过。的最短路问题,就是一个顶点到其他顶点的。因为1是起点,自己到自己的距离是0。

weixin_73793099的博客 1514
上一篇: UVa 109 SCUD Busters (凸包面积&判断点是否在凸包内部)
下一篇: POJ 1127 Jack Straws (线段不规范相交&&图的连通性&&Floyd-Warshall算法)
synapse7
博客等级 码龄14年 432粉丝 701原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值