【洛谷P1462】通往奥格瑞玛的道路 题解

news/2025/3/28 15:24:34/文章来源:https://www.cnblogs.com/namelessstory/p/18790530

今天来做最短路的题目

直接看题吧 毕竟洛谷可以直接复制md文件的特性比openjudge好多了

P1462 通往奥格瑞玛的道路

题目背景

在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量。

有一天他醒来后发现自己居然到了联盟的主城暴风城。

在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛。

题目描述

在艾泽拉斯,有 \(n\) 个城市。编号为 \(1,2,3,\ldots,n\)

城市之间有 \(m\) 条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联盟的攻击,进而损失一定的血量。

每次经过一个城市,都会被收取一定的过路费(包括起点和终点)。路上并没有收费站。

假设 \(1\) 为暴风城,\(n\) 为奥格瑞玛,而他的血量最多为 \(b\),出发时他的血量是满的。如果他的血量降低至负数,则他就无法到达奥格瑞玛。

歪嘴哦不希望花很多钱,他想知道,在所有可以到达奥格瑞玛的道路中,对于每条道路所经过的城市收费的最大值,最小值为多少。

输入格式

第一行 \(3\) 个正整数,\(n,m,b\)。分别表示有 \(n\) 个城市,\(m\) 条公路,歪嘴哦的血量为 \(b\)

接下来有 \(n\) 行,每行 \(1\) 个正整数,\(f_i\)。表示经过城市 \(i\),需要交费 \(f_i\) 元。

再接下来有 \(m\) 行,每行 \(3\) 个正整数,\(a_i,b_i,c_i\)\(1\leq a_i,b_i\leq n\))。表示城市 \(a_i\) 和城市 \(b_i\) 之间有一条公路,如果从城市 \(a_i\) 到城市 \(b_i\),或者从城市 \(b_i\) 到城市 \(a_i\),会损失 \(c_i\) 的血量。

输出格式

仅一个整数,表示歪嘴哦交费最多的一次的最小值。

如果他无法到达奥格瑞玛,输出 AFK

输入输出样例 #1

输入 #1

4 4 8
8
5
6
10
2 1 2
2 4 1
1 3 4
3 4 3

输出 #1

10

说明/提示

对于 \(60\%\) 的数据,满足 \(n\leq 200\)\(m\leq 10^4\)\(b\leq 200\)

对于 \(100\%\) 的数据,满足 \(1\leq n\leq 10^4\)\(1\leq m\leq 5\times 10^4\)\(1\leq b\leq 10^9\)

对于 \(100\%\) 的数据,满足 \(1\leq c_i\leq 10^9\)\(0\leq f_i\leq 10^9\),可能有两条边连接着相同的城市。

Solution

其实一开始我是不大理解题目的 什么叫“对于每条道路经过的的城市收费的最大值,最小值是多少”
就算看不懂也知道这道题要二分()
好啦,其实意思就是 对于每条到终点的路径中,每条路径被收的钱的最大值,在所有路径中取最小值
那二分就是这样的 你想好check函数 然后l和r微调就能出来
主要是昨天写的时候出现一堆很唐的错误
我们对于check函数 其实就是跑一遍最短路(这里用的Dijkstra),如果碰到比需要的值价钱高的节点就不经过,然后如果扣血会死就返回false 否则返回true
为什么要这么干 因为对于每个给定的mid值 我们只需找出一条合法路径 使得该路径上每个点的价格都不高于mid,这样就可以了
不过,这道题有个特点,就是因为它的值是离散化的,所以最终答案一定在给定的点的价钱中出现,可以排序后按序号二分,时间会快很多
而且由于1和n必须经过,所以如果是用连续二分的话,l最好赋值成max(price[1],price[n])
记得开long long
下面看代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,tot,m,b;
int x,y,z;
int head[200005],nex[200005],ver[200005],edge[200005];
ll price[20005];
int vis[20005];
ll d[20005];
priority_queue<pair<ll,int>>q;
ll fprice[20005];
void add(int x,int y,int z){ver[++tot]=y;edge[tot]=z;nex[tot]=head[x];head[x]=tot;
}
bool check(ll t){memset(vis,0,sizeof(vis));for(int i=2;i<=n;i++) d[i]=1e9;d[1]=0;if(price[1]>t||price[n]>t) return false;q.push(make_pair(0,1));while(!q.empty()){int x=q.top().second;q.pop();if(vis[x]) continue;vis[x]=1;for(int i=head[x];i;i=nex[i]){int y=ver[i],z=edge[i];if(price[y]>t){continue;}if(d[y]>d[x]+z){d[y]=d[x]+z;q.push(make_pair(-d[y],y));}}}if(d[n]>b) return false;else return true;
}
void dijkstra(){memset(vis,0,sizeof(vis));for(int i=2;i<=n;i++) d[i]=1e9;d[1]=0; q.push(make_pair(0,1));while(!q.empty()){int x=q.top().second;q.pop();if(vis[x]) continue;vis[x]=1;for(int i=head[x];i;i=nex[i]){int y=ver[i],z=edge[i];if(d[y]>d[x]+z){d[y]=d[x]+z;q.push(make_pair(-d[y],y));}}}
}
int main(){scanf("%d%d%d",&n,&m,&b);for(int i=1;i<=n;i++){scanf("%lld",&price[i]);}for(int i=1;i<=n;i++) fprice[i]=price[i];sort(fprice+1,fprice+n+1);for(int i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&z);add(x,y,z);add(y,x,z);}dijkstra();if(d[n]>b){printf("AFK");system("pause");return 0;}int l=1,r=n,mid;while(l<r){mid=(l+r)/2;if(check(fprice[mid])){r=mid;}else{l=mid+1;}}printf("%lld",fprice[l]);system("pause");return 0;
}

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

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

相关文章

解密prompt系列51. R1实验的一些细节讨论

DeepSeek R1出来后业界都在争相复现R1的效果,这一章我们介绍两个复现项目SimpleRL和LogicRL,还有研究模型推理能力的Cognitive Behaviour,项目在复现R1的同时还针对R1训练策略中的几个关键点进行了讨论和消融实验,包括DeepSeek R1出来后业界都在争相复现R1的效果,这一章我…

读DAMA数据管理知识体系指南30文件和内容治理

读DAMA数据管理知识体系指南30文件和内容治理1. 方法 1.1. 诉讼应诉手册1.1.1. 电子取证工作一般在发生诉讼的时候进行1.1.2. 指引应明确电子取证的目标环境,并评估当前环境和目标环境之间是否存在差距1.1.3. 应记载电子取证活动生命周期的业务流程,明确电子取证团队的角色和…

为什么springboot的jar可以直接启动

一、讲述 1.SpringBoot提供了一个插件spring-boot-maven-plugin用于把程序打包成一个可执行的jar包。 2.Spring Boot应用打包之后,生成一个Fat jar(jar包中包含jar),包含了应用依赖的jar包和Spring Boot loader相关的 类。 3.java -jar会去找jar中的manifest文件,在那里面找…

折腾笔记[17]-使用rust创建linux系统服务

使用rust内嵌配置文件, 创建新用户并创建linux的service服务;实现后台服务循环打印时间到`/tmp/log_file_service`. Use Rust to embed configuration files, create new users, and create service services for Systemd; Implement a backend service loop to print time to …

[PNPM] 其他包管理器

Yarn Yarn 这个包管理器是在 2016 的时候由 Facebook、Google、Exponent 以及 Tilde 团队共同开发推出的。当时 Yarn 的出现主要是为了解决 npm 在速度、安全性以及一致性方面的一些问题:安装速度确定性:项目A ---> 直接依赖: libraryX(1.0)-----> 间接依赖:librar…

Kioptrix Level_1

Kioptrix Level 1.1 靶场配置 导入靶场时先将vmx后缀文件中的带有ethernet0的配置行全部删除,再导入靶场,添加一个网络适配器即可 信息收集 查找目标主机ip ┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:84:b2:cc, IPv4: 192.168…

20244209韩仕炜《Python程序设计》实验一报告

课程:《Python程序设计》 班级: 2442 姓名:韩仕炜 实验教师:王志强 学号:20244209 实验日期:2025年3月24日 必修/选修:专选课 1. 实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习变量和类型、字符串、对象、缩进和注释等; 4.编写一…

E1. Canteen (Easy Version)E2 Canteen (Hard Version) 对于旋转操作的深入理解

E1. Canteen (Easy Version) 题解:二分查找 + 模拟 本文大量学习了jiangly的代码对其进行详细的解析并作图对其进行解释 题目链接 深入解析:前缀和最小值旋转的直观意义一、前缀和曲线的数学本质 我们定义前缀和数组为: pre[i+1] = pre[i] + a[i] - b[i]这一公式的物理意义是…

20244209 2024-2025-2 《Python程序设计》实验一报告

课程:《Python程序设计》 班级: 2442 姓名:韩仕炜 实验教师:王志强 学号:20244209 实验日期:2025年3月24日 必修/选修:专选课 1. 实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习变量和类型、字符串、对象、缩进和注释等; 4.编写一…

ASP.NET Core WebApi+React UI开发入门详解

在前段时间,有粉丝反馈能否写一篇基于ASP.NET Core Web Api+React UI进行Web开发的文章,经过查阅相关资料,发现Visual Studio 2022已经集成相关模板,可以在Visual Studio中直接创建项目项目,今天以一个小例子,简述ASP.NET Core Web Api+React UI开发系统的基本步骤,仅供…

一文速通Python并行计算:02 Python多线程编程-threading模块、线程的创建和查询与守护线程

本文介绍了Python threading模块的核心功能,包括线程创建与管理、线程状态监控以及守护线程的特殊应用,重点讲解了Thread类的实例化方法、获取当前线程信息、检测线程存活状态,以及如何实现后台线程。一文速通 Python 并行计算:02 Python 多线程编程-threading 模块、线程的…