题目地址:

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​};单次最大收费的最大可能即为max⁡ifi\max_if_imaxi​fi​,此为右端点。对于每个位于区间内的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(mlog⁡nlog⁡(R−L))O(m\log n\log (R-L))O(mlognlog(R−L)),L=max⁡{f1,fn},R=max⁡ifiL=\max\{f_1,f_n\}, R=\max_i f_iL=max{f1​,fn​},R=maxi​fi​,空间O(n+m)O(n+m)O(n+m)。

【洛谷】P1462 通往奥格瑞玛的道路相关推荐

  1. 洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA

    洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA 二分交费最多的一次的钱数 然后只将符合要求的边加入图中 如果到终点的最短路大于等于血量 或者直接起点不能到达终点 那么说明不符合要求 需要 ...

  2. 洛谷P1462 通往奥格瑞玛的道路 题解

    洛谷P1462 通往奥格瑞玛的道路 题解 题目链接:P1462 通往奥格瑞玛的道路 题意:在艾泽拉斯,有 nnn 个城市.编号为 1,2,3,-,n1,2,3,\ldots,n1,2,3,-,n . ...

  3. 洛谷 P1462 通往奥格瑞玛的道路 Label: 最小化最大值 spfa (存多条边示例)

    题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯, ...

  4. 洛谷P1462 通往奥格瑞玛的道路

    题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量. 有一天他醒来后发现自己居然到了联盟的主城暴风城. 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛. 题目描述 在艾泽 ...

  5. 洛谷 P1462 通往奥格瑞玛的道路

    Description 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 在艾泽拉 ...

  6. 洛谷 1462 通往奥格瑞玛的道路

    题目背景 Background 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛. ...

  7. [洛谷1462 ]通往奥格瑞玛的道路---二分答案+spfa

    题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯, ...

  8. 洛谷 1462 通往奥格瑞玛的道路 题解

    博客观赏效果更佳 题意简述 nnn个点mmm条边的无向图,点边均有权.给定bbb.请你找到一个从1到n的路使得边权和<=b且点权的最大值最小. 思路 二分+最短路.对于一个mid,把所有点权&l ...

  9. 洛谷1462 通往奥格瑞玛的道路 二分+spfa

    题目链接: https://www.luogu.org/problem/show?pid=1462 题意: 题解: 二分法+最短路判定. 二分经过城市的最大费用w,然后判定:对于每一个费用大于w的城市 ...

  10. 洛谷:P1462 通往奥格瑞玛的道路

    题目连接:P1462 通往奥格瑞玛的道路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目要求是假如有多条路线,求出每条路线的最大值然后选出其中的最小值. 一般这种问法都是二分. ...

最新文章

  1. exchange 2003配置ASSP 反垃圾邮件
  2. [转]SQL 约束讲解
  3. 关于 SAP Fiori Elements 应用标题属性(title) 的复制逻辑单步调试
  4. 笔记本电脑键盘切换_有哪些好用的办公键盘
  5. Github 15K! 亿级向量相似度检索库Faiss 原理+应用
  6. SHELL 分析 列出当天访问次数最多的IP
  7. 6种java垃圾回收算法_学习java垃圾回收
  8. 利用c语言编制1个程序,实现对给定语法句子的递归下降分析.,递归下降语法分析 - osc_3ubrwgtm的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. 关系模式无损分解的测试方法
  10. 移动互联网创业机会只剩3年
  11. 抱薪者说 | 从零开始 ,社区年会诞生记
  12. ubuntu 更换系统源和pip源
  13. MySQL 内连接、外连接、全连接
  14. MIXLAB_NASA_TICKET生成
  15. 如何查看Win11的CUDA版本
  16. 基于小波变化图像融合
  17. tf2 自定义循环训练,添加metrics(acc、auc、precision、recall)
  18. 【深度学习】:非极大值抑制(NMS)详解
  19. java数组转换为集合
  20. GAT和GCN的局限性

热门文章

  1. 第28课:彻底解密Spark Sort-Based Shuffle排序具体实现内幕和源码详解
  2. java中 a-zA-z_关于java:Regex:/ w表示[a-zA-Z]还是[a-zA-Z0-9_],因为大多数教程都提到w-匹配单词字符?...
  3. ROOK-01 集群简单搭建和卸载
  4. 计算机健康小知识,日常生活养生小知识
  5. 2019届本科计算机工资,2019届本科毕业生平均月薪出炉!
  6. GBase 8s灾备集群HAC介绍
  7. 旷世天才:尼古拉·特斯拉
  8. srsLTE安装、运行及测试
  9. 【ZCMU1603】卡斯丁狗的战舰帝国(并查集)
  10. MySQL:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements