【洛谷 P8802】[蓝桥杯 2022 国 B] 出差 题解(带权无向图+单源最短路+Dijkstra算法+链式前向星+最小堆)

[蓝桥杯 2022 国 B] 出差

题目描述

A \mathrm{A} A 国有 N N N 个城市,编号为 1 … N 1 \ldots N 1N 小明是编号为 1 1 1 的城市中一家公司的员工,今天突然接到了上级通知需要去编号为 N N N 的城市出差。

由于疫情原因,很多直达的交通方式暂时关闭,小明无法乘坐飞机直接从城市 1 1 1 到达城市 N N N,需要通过其他城市进行陆路交通中转。小明通过交通信息网,查询到了 M M M 条城市之间仍然还开通的路线信息以及每一条路线需要花费的时间。

同样由于疫情原因,小明到达一个城市后需要隔离观察一段时间才能离开该城市前往其他城市。通过网络,小明也查询到了各个城市的隔离信息。(由于小明之前在城市 1 1 1,因此可以直接离开城市 1 1 1,不需要隔离)

由于上级要求,小明希望能够尽快赶到城市 N \mathrm{N} N, 因此他求助于你,希望你能帮他规划一条路线,能够在最短时间内到达城市 N N N

输入格式

1 1 1 行:两个正整数 N , M N, M N,M 表示 A 国的城市数量, M M M 表示末关闭的路线数量。

2 2 2 行: N N N 个正整数,第 i i i 个整数 C i C_{i} Ci 表示到达编号为 i \mathrm{i} i 的城市后需要隔离的时间。

3 … M + 2 3 \ldots M+2 3M+2 行: 每行 3 3 3 个正整数, u , v , c u, v, c u,v,c, 表示有一条城市 u u u 到城市 v v v 的双向路线仍然开通着,通过该路线的时间为 c c c

输出格式

1 1 1 行: 1 1 1 个正整数,表示小明从城市 1 1 1 出发到达城市 N N N 的最短时间。(到达城市 N N N,不需要计算城市 N N N 的隔离时间)

样例 #1

样例输入 #1

4 4
5 7 3 4
1 2 4
1 3 5
2 4 3
3 4 5

样例输出 #1

13

提示

【样例说明】

【评测用例规模与约定】

对于 100 % 100 \% 100% 的数据, 1 ≤ N ≤ 1000 , 1 ≤ M ≤ 10000 , 1 ≤ C i ≤ 200 , 1 ≤ u , v ≤ 1 \leq N \leq 1000,1 \leq M \leq 10000,1 \leq C_{i} \leq 200,1 \leq u, v \leq 1N1000,1M10000,1Ci200,1u,v N , 1 ≤ c ≤ 1000 N, 1 \leq c \leq 1000 N,1c1000

蓝桥杯 2022 国赛 B 组 E 题。


思路

首先从输入中读取城市数量 n 和开放的路线数量 m。然后读取每个城市的隔离时间,存储在数组 c 中。接着读取 m 条边的信息,每条边包含起始城市 u,目标城市 v,以及通过该路线需要的时间 w。对于每条边,都将其添加到链式前向星中,同时将该城市的隔离时间加到边的权重上。这样做的目的是在计算从城市 u 到城市 v 的时间时,同时考虑了在城市 v 的隔离时间。

通过 Dijkstra 算法来找到从城市 1 到城市 n 的最短路径。使用 vis.reset() 初始化所有节点为未访问状态。然后,对于每个节点,如果节点是源点(城市 1),则其到自己的最短距离 dist[i] 为 0,并将其加入优先队列 hmin 中。否则,将其最短距离设置为无穷大,并将其前驱节点 prior[i] 设置为 -1,表示还没有找到到达它的最短路径。

然后进入主循环,当优先队列不为空时,取出队列顶部的节点 t,其中 t.v 是节点编号,t.d 是从源点到该节点的当前最短距离。如果该节点已经被访问过,则跳过。否则,将其标记为已访问。然后,遍历从节点 u 出发的所有边,如果通过当前边到达节点 v 的距离 du + edge[i].w 小于 v 的当前最短距离 dist[v],则更新 dist[v],并将 v 加入优先队列。

这个过程会持续,直到优先队列为空,或者找到目标节点 n。注意,dist[v] 中的值是从源点到达 v 并在 v 进行隔离的总时间,所以在最后的结果中需要减去城市 n 的隔离时间。

注意

  1. 到达一个城市后需要隔离观察一段时间才能离开该城市前往其他城市,将终点城市的隔离时间加到边的权重上即可。
  2. 到达城市 n 后不需要隔离,所以在最后的结果中需要减去城市 n 的隔离时间。

AC代码

#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstring>
#include <iostream>
#include <queue>
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;const int N = 1e6 + 7;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;struct Edge {int w, to, next;
} edge[N];
int head[N];
int cnt = 0;struct Node {int v, d;bool operator<(const Node &b) const { return d > b.d; }
};int n, m;
int c[N];// 最短路径长度
int dist[N];
// 前驱节点
int prior[N];
bitset<N> vis;
priority_queue<Node> hmin;void add(int u, int v, int w) {edge[cnt] = {w, v, head[u]};head[u] = cnt++;
}void dijkstra() {vis.reset();for (int i = 1; i <= n; i++) {if (i == 1) {dist[i] = 0;hmin.push({i, 0});} else {dist[i] = INF;prior[i] = -1;}}while (hmin.size()) {auto t = hmin.top();hmin.pop();int u = t.v;int du = t.d;if (vis[u]) {continue;}vis[u] = 1;for (int i = head[u]; ~i; i = edge[i].next) {int v = edge[i].to;if (dist[v] > (du + edge[i].w)) {dist[v] = du + edge[i].w;prior[v] = u;hmin.push({v, dist[v]});}}}
}int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);memset(head, -1, sizeof(head));cin >> n >> m;for (int i = 1; i <= n; i++) {cin >> c[i];}for (int i = 1; i <= m; i++) {int u, v, w;cin >> u >> v >> w;// 到达一个城市后需要隔离观察一段时间才能离开该城市前往其他城市add(u, v, w + c[v]);add(v, u, w + c[u]);}dijkstra();// 到达n城后不需要隔离cout << dist[n] - c[n] << "\n";return 0;
}

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

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

相关文章

MXXE利用XXE漏洞快速获取服务器敏感文件工具

https://github.com/MartinxMax/MXXE 关于 MXXEV1.2升级版,快速获取服务器敏感文件 获取Windows服务器敏感文件 把数据包复制到payload.txt进行自动注入 $ python3 MXXE.py -lh 10.10.16.5 -user Daniel -server windows 幸运的是我们找到了服务器的私匙 获取Linux服务器敏感…

LeetCode-706. 设计哈希映射【设计 数组 哈希表 链表 哈希函数】

LeetCode-706. 设计哈希映射【设计 数组 哈希表 链表 哈希函数】 题目描述&#xff1a;解题思路一&#xff1a;超大数组解题思路二&#xff1a;拉链法解题思路三&#xff1a; 题目描述&#xff1a; 不使用任何内建的哈希表库设计一个哈希映射&#xff08;HashMap&#xff09;。…

数字孪生与企业

数字孪生技术&#xff0c;简而言之&#xff0c;就是创造一个物理实体的数字双胞胎&#xff0c;在虚拟世界中精确模拟现实世界的行为、过程和系统。这种技术的核心在于&#xff0c;它允许我们在数字环境中实时地监控、分析和优化其物理对应物的性能和效率。数字孪生的应用场景极…

【深入理解】width 的默认值,2024年最新面试复盘

先自我介绍一下&#xff0c;小编浙江大学毕业&#xff0c;去过华为、字节跳动等大厂&#xff0c;目前阿里P7 深知大多数程序员&#xff0c;想要提升技能&#xff0c;往往是自己摸索成长&#xff0c;但自己不成体系的自学效果低效又漫长&#xff0c;而且极易碰到天花板技术停滞…

Win 运维 | Windows Server 系统事件日志浅析与日志审计实践

[ 重剑无锋&#xff0c;大巧不工。] 大家好&#xff0c;我是【WeiyiGeek/唯一极客】一个正在向全栈工程师(SecDevOps)前进的技术爱好者 作者微信&#xff1a;WeiyiGeeker 公众号/知识星球&#xff1a;全栈工程师修炼指南 主页博客: 【 https://weiyigeek.top 】- 为者常成&…

leetcode代码记录(Z 字形变换

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时&#xff0c;排列如下&#xff1a;…

《QT实用小工具·二十五》日志重定向输出

1、概述 源码放在文章末尾 日志重定向输出&#xff0c;包含如下功能&#xff1a; 支持动态启动和停止。支持日志存储的目录。支持网络发出打印日志。支持输出日志上下文信息比如所在代码文件、行号、函数名等。支持设置日志文件大小限制&#xff0c;超过则自动分文件&#xf…

Unity笔记之下拉刷新列表

这样的效果&#xff1b; 代码&#xff1a; using System; using System.Collections; using System.Collections.Generic; using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public class ScrollRectUpdateView : Mon…

NLP中的Transformer,一文掌握

Transformer变压器模型的出现 2017 年&#xff0c;Vaswani 等人在关键论文“Attention is All You Need”中介绍了 Transformer 模型&#xff0c;它标志着与以前占主导地位的基于递归神经网络的模型&#xff08;如 LSTM&#xff08;长短期记忆&#xff09;和 GRU&#xff08;门…

北京大学快手发布统一的图文视频生成大模型Video-LaVIT

随着多模态大语言模型&#xff08;LLMs&#xff09;的新发展&#xff0c;人们越来越关注如何将它们从图像-文本数据扩展到更具信息量的真实世界视频。与静态图像相比&#xff0c;视频为有效的大规模预训练带来了独特的挑战&#xff0c;因为需要对其时空动态进行建模。 针对视频…

【JavaEE初阶系列】——网络原理之进一步了解应用层以及传输层的UDP协议

目录 &#x1f6a9;进一步讲应用层 &#x1f388;自定义应用层协议 &#x1f388;用什么格式组织 &#x1f469;&#x1f3fb;‍&#x1f4bb;xml(远古的数据组织格式) &#x1f469;&#x1f3fb;‍&#x1f4bb;json(当下最流行得一种数据组织格式) &#x1f469;&…

[lesson31]完善的复数类

完善的复数类 完善的复数类 复数类应该具有的操作 运算&#xff1a;&#xff0c;-&#xff0c;*&#xff0c;/比较&#xff1a;&#xff0c;!赋值&#xff1a;求模&#xff1a;modulus 利用操作符重载 统一复数与实数的运算方式统一复数与实数的比较方式 注意事项 C规定赋…

【max材质addtive叠加模式特效渲染不出通道的解决办法】

max材质addtive叠加模式特效渲染不出通道的解决办法 2021-12-22 18:15 max的scanline扫描线&#xff0c;vray渲染可以&#xff0c;红移不行(只支持它自己的材质&#xff0c;它自己的材质没有additive模式)。据说mr是可以的。 右侧的球体使用附加不透明度。 附加不透明度通过将…

C++内存管理与模版(用法详解)

C/C中程序内存区域划分 内核空间&#xff08;用户代码不能读写&#xff09;栈&#xff08;函数中存放的变量&#xff09;内存映射段堆&#xff08;重点&#xff09;数据段&#xff08;静态区&#xff09;全局变量 / 静态变量代码段&#xff08;常量区&#xff09; 试分析下列…

Opencv3.4+FFMpeg3.4+pkg-config交叉编译arm开发板

Ubuntu16.04 64位 FFmpeg3.4 OpenCv3.4 一、下载FFmpeg https://github.com/FFmpeg/FFmpeg 1.配置 ./configure --prefix/home/zeng/ffmpeg_install --enable-cross-compile --cross-prefixarm-linux-gnueabihf- --ccarm-linux-gnueabihf-gcc --target-oslinux --cpuco…

负载均衡器如何工作,为什么如此重要?

现代应用程序和网站处理大量流量。负载均衡器是保证大型系统平稳运行的主要工具之一。 负载平衡器负责跨多个服务器路由客户端请求以分配负载并防止出现瓶颈。 这有助于最大限度地提高吞吐量、减少响应时间并优化资源使用。 负载均衡器的运行情况&#xff1a; (1).客户端请…

阿姨吐槽年轻人卧铺挂帘子不让坐 评论区吵翻天了

近日&#xff0c;网络流传的一段短视频激起了公众的广泛热议。 这段视频展现了一位阿姨与在下铺挂帘子的年轻人之间的冲突。 视频中&#xff0c;阿姨情绪激动&#xff0c;她用镜头对准了那位年轻人&#xff0c;指责他在下铺挂帘子&#xff0c;使得一位70岁的老人无法坐下。 阿姨…

EasyRecovery数据恢复软件2024免费版下载亲测可用(支持win7,win10)

EasyRecovery数据恢复软件是由全球著名的数据恢复公司Ontrack出品的一款专业级数据文件恢复工具。它支持恢复多种存储介质上的数据&#xff0c;包括硬盘、光盘、U盘/移动硬盘、数码相机以及Raid文件恢复等&#xff0c;能恢复的文件类型也相当丰富&#xff0c;包括文档、表格、图…

磁盘管理和文件系统

一.磁盘基础 1.磁盘结构 &#xff08;1&#xff09;物理结构&#xff1a; 盘片&#xff1a;硬盘有多个盘片&#xff0c;每盘片2面 磁头&#xff1a;每面一个磁头 &#xff08;2&#xff09;硬盘的数据结构 扇区&#xff1a;盘片被分为多个扇形区域&#xff0c;每个扇区存…

Django之rest_framework(四)

扩展的视图类介绍 rest_framework提供了几种后端视图(对数据资源进行增删改查)处理流程的实现,如果需要编写的视图属于这几种,则视图可以通过继承相应的扩展类来复用代码,减少自己编写的代码量 官网:3 - Class based views - Django REST framework rest_framework.mixi…