【模板】【洛谷P4779】 单源最短路径 (优先队列 堆优化)

洛谷P4779 【模板】单源最短路径(标准版)(dijkstra+优先队列-堆优化:时间复杂度o((m+n)logn)) 题目背景 2018 年 7 月 19 日,某位同学在NOI Day 1 T1 归程一题里非常熟练地使用了一个广为人知的算法求最短路。 然后呢? 100 \rightarrow 60100→60; Ag \rightarrow CuAg→Cu; 最终,他因此没能与理想的大学达成契约。 小 F 衷心祝愿大家不再重蹈覆辙。 题目描述 给定一个NN个点,MM条有向边的带非负权图,... 阅读详情

这里先不放题 我们来说说这个模板需要用到哪些知识点

1.优先队列 (priority_queue)(用于优化) //这个百度一下就明白了

2.运算符重载 (洛谷好像不支持友元函数重载,会编译错误) (更改优先队列排序顺序) //同上 百度

3.BFS(思维核心) https://www.bilibili.com/video/av25829980  这个视频讲的很好,后半段的代码就不用看了 自己敲

4.链式前向星(用来存图) //https://blog.youkuaiyun.com/acdreamers/article/details/16902023 带你深入了解为何这样建图

一发A掉还是很开心的,自己其实也没想到 .


题目背景

2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路。

然后呢?

100→60100 \rightarrow 60100→60 ;

Ag→CuAg \rightarrow CuAg→Cu ;

最终,他因此没能与理想的大学达成契约。

小 F 衷心祝愿大家不再重蹈覆辙。

题目描述

给定一个 NNN 个点, MMM 条有向边的带非负权图,请你计算从 SSS 出发,到每个点的距离。

数据保证你能从 SSS 出发到任意点。

输入输出格式

输入格式:

 

第一行为三个正整数 N,M,SN, M, SN,M,S 。 第二行起 MMM 行,每行三个非负整数 ui,vi,wiu_i, v_i, w_iui​,vi​,wi​ ,表示从 uiu_iui​ 到 viv_ivi​ 有一条权值为 wiw_iwi​ 的边。

 

输出格式:

 

输出一行 NNN 个空格分隔的非负整数,表示 SSS 到每个点的距离。

 

输入输出样例

输入样例#1: 复制

4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4

输出样例#1: 复制

0 2 4 3

说明

样例解释请参考 数据随机的模板题。

1≤N≤1000001 \leq N \leq 1000001≤N≤100000 ;

1≤M≤2000001 \leq M \leq 2000001≤M≤200000 ;

S=1S = 1S=1 ;

1≤ui,vi≤N1 \leq u_i, v_i\leq N1≤ui​,vi​≤N ;

0≤wi≤1090 \leq w_i \leq 10 ^ 90≤wi​≤109 ,

0≤∑wi≤1090 \leq \sum w_i \leq 10 ^ 90≤∑wi​≤109 。

本题数据可能会持续更新,但不会重测,望周知。


#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
#define maxn 500005
#define mod 1e9+7
#define inf 2147483647
typedef long long ll;
ll n,m,s,ans[maxn],head[maxn],num,flag[maxn]; 
struct Why
{
    ll next,now,dis;
}plat[maxn]; //结构体表示静态邻接表
struct Whhy  
{
    ll now,dis;
    Whhy(ll x,ll y)
    {
        now = x;
        dis = y;
    }
    bool operator < (const Whhy t) const //重载
    {
        return dis > t.dis;
    }
};
void build(ll a,ll b,ll c) //链式前向星建图
{
    plat[++num].next = head[a]; //链式存储下一条边
    plat[num].now = b; //记录可以到达的当前节点编号
    plat[num].dis = c; //记录到当前节点编号的距离
    head[a] = num; //记录下一次出边情况
    return ;
}
void bfs(ll x)
{
    priority_queue<Whhy>A;
    A.push( Whhy(x,0) );
    while(!A.empty())
    {
        Whhy temp = A.top();
        A.pop();
        if( flag[temp.now] == 0 )
        {
            flag[ temp.now ] = 1;
            if( temp.dis < ans[ temp.now  ]  )  //更新ans数组 
                ans[ temp.now ] = temp.dis;
            for(ll i = head[temp.now]; i != 0; i = plat[i].next )
            {
                A.push( Whhy( plat[i].now, temp.dis+plat[i].dis) );
            }
        }
    }
    return ;
}
int main()
{
    ios::sync_with_stdio(false);
    cin >> n >> m >> s;
    for(ll i = 1; i <= m; i++)
    {
        ll a,b,c;
        cin >> a >> b >> c;
        build(a,b,c);
    }
    for(ll i = 1; i <= n; i++) 
        ans[i] = inf;
    bfs(s);
    for(ll i = 1; i <= n; i++)
        cout << ans[i] << " ";
    cout << endl;
    return 0;
}

 

洛谷【模板】单源最短路径(超详细版) 本文介绍了单源最短路径问题的两种解法:普通Dijkstra算法和堆优化Dijkstra算法。作者首先通过P3371模板题展示了普通Dijkstra的实现方法,指出其时间复杂度为O(n²)会导致在较难题目中TLE。接着以P4779为例,引入优先队列进行堆优化,将时间复杂度降至O(mlogn)。文章包含详细代码实现,并对比了最小生成树Prim算法与最短路算法的异同。最后推荐了相关练习题,帮助读者巩固所学知识。 阅读详情

相关推荐

【模板】单源最短路径(弱化版)

本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步。这个弱化版的数据较弱,普通Dijkstra也能过,但P4779就很怪,要用堆优化…如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。使用c++STL优先队列,用c++STL vector存图。使用Dijkstra要注意的是,它是一种单源最短路算法…,分别表示点的个数、有向边的个数、出发点的编号。个点的最短路径,若不能到达则输出。

hhhh 1587

图的最短路径-优先队列优化版

给出一个图的邻接矩阵,输入顶点v,用迪杰斯特拉算法求顶点v到其它顶点的最短路径。第一行输入t,表示有t个测试实例第二行输入顶点数n和n个顶点信息第三行起,每行输入邻接矩阵的一行,以此类推输入n行第i个结点与其它结点如果相连则为距离,无连接则为0,数据之间用空格隔开。第四行输入v0,表示求v0到其他顶点的最短路径距离以此类推输入下一个示例。

m0_74924621的博客 633

堆优化Dijkstra算法详解:从稀疏图挑战到洛谷P4779模板实战

单源最短路径是图论与算法竞赛中的核心问题,其经典解法Dijkstra算法在稠密图中表现良好,但在节点与边数量级均达到10^5的稀疏图场景下,朴素的O(n²)实现会因频繁的全局查找最小距离节点而超时。其优化原理在于引入优先队列(通常用二叉堆实现),将查找最小值的操作从O(n)降至O(log n),从而将整体复杂度优化至O(E log n)。这一技术价值在于,它实现了理论算法到高效工程实践的跨越,是处理大规模网络路由、地图导航等实际应用的基础。堆优化的关键在于维护一个可能包含冗余状态的候选集,并通过判断弹出状态

weixin_34007020的博客 429

P4779单源最短路径(标准版)

应用的是dijkstra算法,这种算法的思想类似于贪心。 首先,将所有点分为已知最短路和未知最短路两类。开始时,只有出发点的最短路已知,为0,其余点都标记为正无穷。我们要求出出发点到所有点的最短路径,因此进行点数轮循环,每轮循环中,遍历与已知点间有边相连的点,更新与出发点的最短路径。然后从所有更新的路径值中选出最小值,将对应点加入已知最短路径类,循环操作即可。 还有一点,就是选最小值...

banyuan6231的博客 225

C++图论算法---dijkstra(迪杰斯特拉)---洛谷 P4779.单源最短路径

C++图论算法-洛谷 P4779.单源最短路径

TE_OIer_lqy的博客 607

题解:洛谷 P4779 【模板】单源最短路径(标准版)

等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。《洛谷 P4779 单源最短路径(标准版)》 #图论# #优先队列# #最短路# #模板题#条有向边的带非负权图,请你计算从。个空格分隔的非负整数,表示。出发,到每个点的距离。行,每行三个非负整数。本文分享的必刷题目是从。

团爸讲算法 441

P4779 【模板】单源最短路径(标准版) 题解

P4779 【模板】单源最短路径(标准版) 题解 本文使用方法: 图的存储结构:链式前向星 涉及优化:堆优化 算法:Dijkstra算法 P4779:传送门 题目背景 2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路。 然后呢? 100→60; Ag→Cu; 最终,他因此没能与理想的大学达成契约。 小 F 衷心祝愿大家不再重蹈覆辙。 题目描述 给定n个点,m 条有向边的非负权图,请你计算从 s 出发,到每个点的距离。 数据保证你能

风吹落叶的博客 1525

国密套件ECC-SM2-SM4-CBC-SM3和ECDHE-SM2-WITH-SM4-SM3

双方交换各自的公钥,最后A计算点(x1,y1) = d1Q2,B计算点(x2,y2) = d2Q1,由于椭圆曲线上是可以满足乘法交换和结合律,所以 d1Q2 = d1d2G = d2d1G = d2Q1 ,因此双方的 x 坐标是一样的,所以它是共享密钥,也就是会话密钥。4、客户端和服务端分别使用工作密钥,计算主密钥,客户端随机数,服务端随机数,字符串常量"key expansion",经PRF计算生成工作密钥。工作密钥包括加密密钥和校验密钥,具体密钥长度由选择的密码算法决定。客户端支持的压缩算法列表。

Java学习笔记 3784

P4779 【模板】单源最短路径(标准版)

题目链接啦啦啦 这题呢实际上就是比较难A的最短路模板,但还是模板,下面给出带堆优化的Dijkstra+链式前向星 1 #include<set> 2 #include<map> 3 #include<list> 4 #include<queue> 5 #include<stack> 6 #include...

weixin_30332705的博客 277

训练集、验证集、测试集!YOLO系列标签数量统计!

【代码】训练集、验证集、测试集!YOLO系列标签数量统计!

qq_26281057的博客 651

数字IC后端手把手实战教程 | Innovus verify_drc VIA1 DRC Violation解析及脚本自动化修复方案

数字IC后端实战项目案例之Innovus verify_drc DRC Violation脚本自动化修复方案

weixin_37584728的博客 4053

蓝桥备赛 3.30 4.1 Dijkstra算法和优先队列(堆优化)洛谷 P3371 【模板】单源最短路径(弱化版)P4779 【模板】单源最短路径(标准版)

同理,vector < edge > arr[100]就是一个一维数组e,最多含有100个vector < edge > 类型的元素,而每一个vector又是一个一维向量,每一个这个向量都可以插入任意多个edge类型(即结构体)的元素,换句话说,vector < edge > arr[100] 就可以看成一个最多有100行的二维数组,而二维数组的列数是任意个,每一行的元素也不固定,这就保证了内存空间不会浪费。描述图的代码,应该是多了很多用不着的空间,测试用例均是。Dijkstra的堆优化实现,后续更新~

xhy_yyds的博客 1411

PMOS缓启动电路设计实战:用LTspice优化上电时序,把60A冲击降到15A

本文通过一个实战案例,深入解析了PMOS缓启动电路如何有效抑制上电冲击电流。文章指出,低ESR电容是导致冲击电流飙升的元凶,并详细阐述了利用LTspice仿真工具,通过优化栅极电阻和栅源电容等参数,将高达60A的冲击电流成功降至15A的设计与优化过程,为电源开关电路设计提供了可复用的方法论。

onion的博客 900

最短路,Dijkstra算法

本文介绍了两道单源最短路径问题的解法。P3371题目使用Dijkstra算法的朴素实现,通过遍历所有节点寻找最短路径,时间复杂度较高。P4779题目则采用优先队列优化的Dijkstra算法,显著提升了效率。文章包含两个完整代码实现,均采用邻接表存储图结构,初始化距离数组后,通过松弛操作更新最短路径。对于不可达节点,输出2^31-1。文末简要介绍了Dijkstra算法的历史背景、应用场景和基本原理,说明该算法适用于解决赋权有向图的单源最短路径问题。

chenguantong的博客 435

从充电管理芯片里‘偷师’:拆解一个PMOS双向开关电路,搞定你的固态继电器需求

本文深入解析了PMOS双向开关电路在固态继电器应用中的设计要点,重点探讨了防电流倒灌和高侧双向开关的实现技巧。通过拆解充电管理芯片中的PMOS背靠背结构,工程师可以构建高效可靠的固态开关方案,适用于智能硬件和电池管理系统。文章还提供了关键参数选择、电路优化建议及实测数据对比,助力解决电源防反接等工程难题。

weixin_33698043的博客 485

具身大小脑全栈全网独家复现|LLM链式推理+边缘VLA感知+毫秒级运动小脑、优化人形步态僵硬运动滞后、打通思考-行走-操作全链路适配居家工业多场景落地

高层决策大脑(异步10Hz,GPU算力):轻量化机器人微调LLM+RhinoVLA边缘视觉大模型,负责自然语言链式工序拆解、全局环境语义感知、目标物体筛选、跨机器人动作适配,输出粗粒度运动目标,不介入底层伺服计算;依托View Registry实现异构机器人动作对齐,适配多形态机器人切换;中层调度小脑(硬实时1kHz,CPU算力)

qq_36130719的博客 257

考研机试 Dijkstra算法

求解。

m0_73704901的博客 239

CAPL概述与环境搭建

CANoe和CANalyzer是Vector公司开发的两款用于汽车电子系统开发和测试的工具。CANoe主要用于网络开发、仿真和测试,而CANalyzer则主要用于网络分析和诊断。两者都支持CAPL脚本语言,可以用于编写复杂的测试脚本和仿真模型。CAPL Browser是CANoe/CANalyzer中用于编写、编辑和调试CAPL脚本的工具。它提供了一个集成的开发环境,支持语法高亮、代码自动补全、调试等功能。菜单栏:包含文件操作、编辑、编译、调试等功能。工具栏。

闲人编程的博客 1665

洛谷--P4779 【模板】单源最短路径(标准版)

第一行为三个正整数 n,m,s。第二行起 m行,每行三个非负整数 ui,vi,wi​,表示从 ui​ 到 vi 有一条权值为 wi 的有向边。给定一个 n 个点,m 条有向边的带非负权图,请你计算从 s 出发,到每个点的距离。1.初始化让{0,s}入队,d[s]=0,d[其他点]=inf;2.从队头弹出距离最小的点u,若u扩展过则跳过,否则打上标记;输出一行 n个空格分隔的非负整数,表示 s到每个点的距离。利用优先队列priority_queue创建小根堆。本题是dijkstra堆优化模版。

2301_79070220的博客 321

OsgEarth —— 笔记6 - 开发阶段加入漫游飞行(附源码)

效果      视频地址   源码 源码下载请私信   代码      代码相关内容:           OSG —— 笔记1 - 指令调用模型           OsgEarth —— 笔记1 - 创建地球的earth文件           OsgEarth —— 笔记2 - Qt窗口加载earth地球(附源码)           OsgEarth —— 笔记3 - 为地

1896

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

p4779 单源最短路径(标准版)-java、golang

p4779 单源最短路径(标准版)-java版

weixin_58428691的博客 1261

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

单源最短路(dijkstra + 堆优化) P4779 【模板】单源最短路径(标准版)

本文提供了两种Dijkstra算法实现单源最短路径问题的模板代码。第一种使用vector存储图的邻接表,通过优先队列实现;第二种采用链式前向星存图结构。两种实现都包含初始化距离数组、优先队列处理和松弛操作等核心步骤,注释详细解释了关键代码逻辑。虽然作者自嘲水平退步,但提供的代码规范清晰,包含了完整的输入输出处理和算法实现,适合作为模板参考。两种实现方式各具特点,vector版更直观,链式前向星版在稀疏图时更节省空间。

AK_53的博客 23

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

题解:P4779 【模板】单源最短路径(标准版)

首先,题目说的很明白,这个广为人知的最短路算法就是 SPFA,它死了。这题会专门卡 SPFA,别问我咋知道的,在最劣情况下 SPFA 时间复杂度。,边权没有负数的情况下我们通常使用 dijkstra 算法,而在有负边权的情况下通常使用 ‌Bellman-Ford。上面的过程是 dijkstra 的朴素做法,复杂度。,然而这题需要使用更优的时间复杂度。,且可以更新最短路,丢入队列。的最短路,由于我们可以从。,可以更新最短路,丢入队列。的最短路,然后丢入队列。的最短路,然后丢入队列。拿出来,不能遍历,跳过。

Genshin_ht的博客 1万+

洛谷 P4779 【模板】单源最短路径(标准版)

洛谷 P4779 【模板】单源最短路径(标准版) Description 给定一个 N 个点,M 条有向边的带非负权图,请你计算从 S 出发,到每个点的距离。 数据保证你能从 S 出发到任意点。 1≤N≤100000; 1≤M≤200000; S=1 1≤ui,vi≤N 0≤wi≤10的9次方 0≤∑wi≤10的9次方 Input 第一行为三个正整数 N,M,S。 第二行起 M 行...

aochongbi5356的博客 332

洛谷 P4779 【模板】单源最短路径(标准版)【最短路】【堆优化版Dijkstra】

洛谷 P4779 【模板】单源最短路径(标准版)【最短路】【堆优化版Dijkstra】

Derrickhang的博客 472
上一篇: 优先队列用法【转】
下一篇: 牛客练习赛24 D-插排树 【单源最长路经】
Whyckck
博客等级 码龄9年 6粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值