【洛谷】P1462 通往奥格瑞玛的道路
题目地址:
https://www.luogu.com.cn/problem/P1462
题目背景:
在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量。有一天他醒来后发现自己居然到了联盟的主城暴风城。在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛。
题目描述:
在艾泽拉斯,有nnn个城市。编号为1,2,3,…,n1,2,3,\ldots,n1,2,3,…,n。城市之间有mmm条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联盟的攻击,进而损失一定的血量。每次经过一个城市,都会被收取一定的过路费(包括起点和终点)。路上并没有收费站。假设111为暴风城,nnn为奥格瑞玛,而他的血量最多为bbb,出发时他的血量是满的。如果他的血量降低至负数,则他就无法到达奥格瑞玛。歪嘴哦不希望花很多钱,他想知道,在可以到达奥格瑞玛的情况下,他所经过的所有城市中最多的一次收取的费用的最小值是多少。
输入格式:
第一行333个正整数,n,m,bn,m,bn,m,b。分别表示有nnn个城市,mmm条公路,歪嘴哦的血量为bbb。
接下来有nnn行,每行111个正整数,fif_ifi。表示经过城市iii,需要交费fif_ifi元。
再接下来有mmm行,每行333个正整数,ai,bi,cia_i,b_i,c_iai,bi,ci(1≤ai,bi≤n1\leq a_i,b_i\leq n1≤ai,bi≤n)。表示城市aia_iai和城市bib_ibi之间有一条公路,如果从城市aia_iai到城市bib_ibi,或者从城市bib_ibi到城市aia_iai,会损失cic_ici的血量。
输出格式:
仅一个整数,表示歪嘴哦交费最多的一次的最小值。如果他无法到达奥格瑞玛,输出AFK
。
数据范围:
对于60%60\%60%的数据,满足n≤200n\leq 200n≤200,m≤104m\leq 10^4m≤104,b≤200b\leq 200b≤200;
对于100%100\%100%的数据,满足n≤104n\leq 10^4n≤104,m≤5×104m\leq 5\times 10^4m≤5×104,b≤109b\leq 10^9b≤109;
对于100%100\%100%的数据,满足ci≤109c_i\leq 10^9ci≤109,fi≤109f_i\leq 10^9fi≤109,可能有两条边连接着相同的城市。
思路是二分答案 + 最短路。本题是要求在保证血量不变为负的前提下,单次最大收费的最小值可以是多少。容易知道,对于单次最大收费小于等于xxx的情形如果存在方案,那么对于更大的xxx当然也存在方案。从而我们可以用二分。由于起点和终点显然是要收费的,所以二分左端点为max{f1,fn}\max\{f_1,f_n\}max{f1,fn};单次最大收费的最大可能即为maxifi\max_if_imaxifi,此为右端点。对于每个位于区间内的xxx,我们判断只走收费不超过xxx的城市,是否能从111走到nnn,也即判断从111走到nnn,如果将耗血量视为费用,最短路长度是否小于等于bbb,可以用Dijkstra算法来做。如果能,则收缩右端点;否则收缩左端点。代码如下:
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
using PLI = pair<long, int>;const int N = 10010, M = 100010;
int n, m, b, fee[N];
int h[N], e[M], ne[M], w[M], idx;
long dist[N];
bool vis[N];#define add(a, b, c) \
e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++int dijkstra(int maxf) {memset(dist, 0x3f, sizeof dist);memset(vis, 0, sizeof vis);dist[1] = 0;priority_queue<PLI, vector<PLI>, greater<PLI>> heap;heap.push({0, 1});while (heap.size()) {auto t = heap.top(); heap.pop();int u = t.second;if (vis[u]) continue;if (u == n) break;vis[u] = true;for (int i = h[u]; ~i; i = ne[i]) {int v = e[i];if (fee[v] > maxf) continue;if (dist[u] + w[i] < dist[v]) {dist[v] = dist[u] + w[i];heap.push({dist[v], v});}}}return dist[n];
}int main() {memset(h, -1, sizeof h);scanf("%d%d%d", &n, &m, &b);int l = 0, r = 0;for (int i = 1; i <= n; i++) {scanf("%d", &fee[i]);r = max(r, fee[i]);}l = max(fee[1], fee[n]);for (int i = 1; i <= m; i++) {int a, b, c;scanf("%d%d%d", &a, &b, &c);add(a, b, c), add(b, a, c);}while (l < r) {int mid = l + (r - l >> 1);if (dijkstra(mid) <= b) r = mid;else l = mid + 1;}if (dijkstra(l) > b) puts("AFK");else printf("%d\n", l);
}
时间复杂度O(mlognlog(R−L))O(m\log n\log (R-L))O(mlognlog(R−L)),L=max{f1,fn},R=maxifiL=\max\{f_1,f_n\}, R=\max_i f_iL=max{f1,fn},R=maxifi,空间O(n+m)O(n+m)O(n+m)。
【洛谷】P1462 通往奥格瑞玛的道路相关推荐
- 洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA
洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA 二分交费最多的一次的钱数 然后只将符合要求的边加入图中 如果到终点的最短路大于等于血量 或者直接起点不能到达终点 那么说明不符合要求 需要 ...
- 洛谷P1462 通往奥格瑞玛的道路 题解
洛谷P1462 通往奥格瑞玛的道路 题解 题目链接:P1462 通往奥格瑞玛的道路 题意:在艾泽拉斯,有 nnn 个城市.编号为 1,2,3,-,n1,2,3,\ldots,n1,2,3,-,n . ...
- 洛谷 P1462 通往奥格瑞玛的道路 Label: 最小化最大值 spfa (存多条边示例)
题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯, ...
- 洛谷P1462 通往奥格瑞玛的道路
题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量. 有一天他醒来后发现自己居然到了联盟的主城暴风城. 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛. 题目描述 在艾泽 ...
- 洛谷 P1462 通往奥格瑞玛的道路
Description 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 在艾泽拉 ...
- 洛谷 1462 通往奥格瑞玛的道路
题目背景 Background 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛. ...
- [洛谷1462 ]通往奥格瑞玛的道路---二分答案+spfa
题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯, ...
- 洛谷 1462 通往奥格瑞玛的道路 题解
博客观赏效果更佳 题意简述 nnn个点mmm条边的无向图,点边均有权.给定bbb.请你找到一个从1到n的路使得边权和<=b且点权的最大值最小. 思路 二分+最短路.对于一个mid,把所有点权&l ...
- 洛谷1462 通往奥格瑞玛的道路 二分+spfa
题目链接: https://www.luogu.org/problem/show?pid=1462 题意: 题解: 二分法+最短路判定. 二分经过城市的最大费用w,然后判定:对于每一个费用大于w的城市 ...
- 洛谷:P1462 通往奥格瑞玛的道路
题目连接:P1462 通往奥格瑞玛的道路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目要求是假如有多条路线,求出每条路线的最大值然后选出其中的最小值. 一般这种问法都是二分. ...
最新文章
- exchange 2003配置ASSP 反垃圾邮件
- [转]SQL 约束讲解
- 关于 SAP Fiori Elements 应用标题属性(title) 的复制逻辑单步调试
- 笔记本电脑键盘切换_有哪些好用的办公键盘
- Github 15K! 亿级向量相似度检索库Faiss 原理+应用
- SHELL 分析 列出当天访问次数最多的IP
- 6种java垃圾回收算法_学习java垃圾回收
- 利用c语言编制1个程序,实现对给定语法句子的递归下降分析.,递归下降语法分析 - osc_3ubrwgtm的个人空间 - OSCHINA - 中文开源技术交流社区...
- 关系模式无损分解的测试方法
- 移动互联网创业机会只剩3年
- 抱薪者说 | 从零开始 ,社区年会诞生记
- ubuntu 更换系统源和pip源
- MySQL 内连接、外连接、全连接
- MIXLAB_NASA_TICKET生成
- 如何查看Win11的CUDA版本
- 基于小波变化图像融合
- tf2 自定义循环训练,添加metrics(acc、auc、precision、recall)
- 【深度学习】:非极大值抑制(NMS)详解
- java数组转换为集合
- GAT和GCN的局限性
热门文章
- 第28课:彻底解密Spark Sort-Based Shuffle排序具体实现内幕和源码详解
- java中 a-zA-z_关于java:Regex:/ w表示[a-zA-Z]还是[a-zA-Z0-9_],因为大多数教程都提到w-匹配单词字符?...
- ROOK-01 集群简单搭建和卸载
- 计算机健康小知识,日常生活养生小知识
- 2019届本科计算机工资,2019届本科毕业生平均月薪出炉!
- GBase 8s灾备集群HAC介绍
- 旷世天才:尼古拉·特斯拉
- srsLTE安装、运行及测试
- 【ZCMU1603】卡斯丁狗的战舰帝国(并查集)
- MySQL:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements