P1462 通往奥格瑞玛的道路【二分+Dij】
P1462 通往奥格瑞玛的道路
推荐题目
题目背景
在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量
有一天他醒来后发现自己居然到了联盟的主城暴风城
在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛
题目描述
在艾泽拉斯,有n个城市。编号为1,2,3,...,n。
城市之间有m条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联盟的攻击,进而损失一定的血量。
每次经过一个城市,都会被收取一定的过路费(包括起点和终点)。路上并没有收费站。
假设1为暴风城,n为奥格瑞玛,而他的血量最多为b,出发时他的血量是满的。
歪嘴哦不希望花很多钱,他想知道,在可以到达奥格瑞玛的情况下,他所经过的所有城市中最多的一次收取的费用的最小值是多少。
输入格式
第一行3个正整数,n,m,b。分别表示有n个城市,m条公路,歪嘴哦的血量为b。
接下来有n行,每行1个正整数,fi。表示经过城市i,需要交费fi元。
再接下来有m行,每行3个正整数,ai,bi,ci(1<=ai,bi<=n)。表示城市ai和城市bi之间有一条公路,如果从城市ai到城市bi,或者从城市bi到城市ai,会损失ci的血量。
输出格式
仅一个整数,表示歪嘴哦交费最多的一次的最小值。
如果他无法到达奥格瑞玛,输出AFK。
输入输出样例
- 4 4 8
- 8
- 5
- 6
- 10
- 2 1 2
- 2 4 1
- 1 3 4
- 3 4 3
- 10
说明/提示
对于60%的数据,满足n≤200,m≤10000,b≤200
对于100%的数据,满足n≤10000,m≤50000,b≤1000000000
对于100%的数据,满足ci≤1000000000,fi≤1000000000,可能有两条边连接着相同的城市。
题意:找到一条从 1 到 n 的路,且满足路上在某个点交过路费的最大值要最小。
- #include <bits/stdc++.h>
- #define dbg(x) cout << #x << "=" << x << endl
- #define eps 1e-8
- #define pi acos(-1.0)
- using namespace std;
- typedef long long LL;
- template<class T>inline void read(T &res)
- {
- char c;T flag=;
- while((c=getchar())<''||c>'')if(c=='-')flag=-;res=c-'';
- while((c=getchar())>=''&&c<='')res=res*+c-'';res*=flag;
- }
- namespace _buff {
- const size_t BUFF = << ;
- char ibuf[BUFF], *ib = ibuf, *ie = ibuf;
- char getc() {
- if (ib == ie) {
- ib = ibuf;
- ie = ibuf + fread(ibuf, , BUFF, stdin);
- }
- return ib == ie ? - : *ib++;
- }
- }
- int qread() {
- using namespace _buff;
- int ret = ;
- bool pos = true;
- char c = getc();
- for (; (c < '' || c > '') && c != '-'; c = getc()) {
- assert(~c);
- }
- if (c == '-') {
- pos = false;
- c = getc();
- }
- for (; c >= '' && c <= ''; c = getc()) {
- ret = (ret << ) + (ret << ) + (c ^ );
- }
- return pos ? ret : -ret;
- }
- const int maxn = 1e5 + ;
- const int inf = 0x3f3f3f3f;
- int head[maxn << ], edge[maxn << ], w[maxn << ], nxt[maxn << ];
- int cnt, b;
- int f[maxn << ];
- inline void BuildGraph (int u, int v, int c) {
- cnt++;
- edge[cnt] = v;
- nxt[cnt] = head[u];
- w[cnt] = c;
- head[u] = cnt;
- }
- struct node {
- int u,v;
- bool operator <(const node &t) const {
- return u > t.u;
- }
- };
- int n,m,s,t,maxx;
- int dis[maxn];
- priority_queue < node > q;
- bool check(int x) {
- if(x < f[])
- return ;
- for (int i = ; i <= n; ++i) {
- dis[i] = inf;
- }
- dis[] = ;
- node temp;
- temp.u = ;
- temp.v = ;
- q.push(temp);
- while(!q.empty()) {
- int u = q.top().v;
- int d = q.top().u;
- q.pop();
- if(d != dis[u]) continue;
- for (int i = head[u]; i; i = nxt[i]) {
- int v = edge[i];
- int c = w[i];
- if(dis[v] > dis[u] + c && f[v] <= x) {
- dis[v] = dis[u] + c;
- node p;
- p.u = dis[v], p.v = v;
- q.push(p);
- }
- }
- }
- if(dis[n] < b) {
- return ;
- }
- return ;
- }
- int main()
- {
- scanf("%d %d %d",&n,&m,&b);
- for (int i = ; i <= n; ++i) {
- scanf("%d",&f[i]);
- maxx = max(maxx, f[i]);
- }
- for (int i = ; i <= m; i++) {
- int u, v, c;
- scanf("%d %d %d",&u,&v,&c);
- BuildGraph(u, v, c);
- BuildGraph(v, u, c);
- }
- if(!check(inf)) {
- puts("AFK");
- return ;
- }
- int l = , r = inf, mid = (l + r) >> ;
- while(l <= r) {
- if(check(mid)) {
- r = mid - ;
- mid = (l + r) >> ;
- }
- else {
- l = mid + ;
- mid = (l + r) >> ;
- }
- }
- printf("%d\n",l);
- return ;
- }
P1462 通往奥格瑞玛的道路【二分+Dij】的更多相关文章
- P1462 通往奥格瑞玛的道路 (二分+最短路)
题目 P1462 通往奥格瑞玛的道路 给定\(n\)个点\(m\)条边,每个点上都有点权\(f[i]\),每条边上有边权,找一条道路,使边权和小于给定的数\(b\),并使最大点权最小. 解析 二分一下 ...
- [Luogu P1462] 通往奥格瑞玛的道路 (二分答案+最短路径)
题面 传送门:https://www.luogu.org/problemnew/show/P1462 Solution 这道题如果去除掉经过城市的收费.那么就是裸的最短路 但是题目要求经过城市中最多的 ...
- 洛谷 - P1462 - 通往奥格瑞玛的道路 - 二分 - Dijkstra
https://www.luogu.org/problem/P1462 感觉,要二分最大收费权的城市,把小于等于它的全部插进去,Dijkstra一下求出最小的血量.这样感觉太暴力了. 考虑只有1000 ...
- 洛谷P1462 通往奥格瑞玛的道路[二分答案 spfa 离散化]
题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯, ...
- 洛谷P1462通往奥格瑞玛的道路——二分答案最短路
题目:https://www.luogu.org/problemnew/show/P1462 最大值最小问题,二分答案. 代码如下: #include<iostream> #include ...
- 洛谷 P1462 通往奥格瑞玛的道路——二分+spfa
上一波链接 https://www.luogu.org/problem/P1462 这道题我们考虑二分答案 然后每次跑一次spfa判断是否能够到达n点 tips:在不考虑负权边的前提下我们写最短路最好 ...
- Luogu P1462 通往奥格瑞玛的道路 二分答案+最短路
先二分答案,再跑最短路,跑的时候遇到 过路费超过二分的答案的 就不拿他更新最短路 #include<cstdio> #include<iostream> #include< ...
- 洛谷 P1462 通往奥格瑞玛的道路 二分 最短路
#include<cstdio> #include<queue> #include<cstring> #include<algorithm> using ...
- 洛谷P1462 通往奥格瑞玛的道路(二分+spfa,二分+Dijkstra)
洛谷P1462 通往奥格瑞玛的道路 二分费用. 用血量花费建图,用单源最短路判断 \(1\) 到 \(n\) 的最短路花费是否小于 \(b\) .二分时需要不断记录合法的 \(mid\) 值. 这里建 ...
随机推荐
- 移植freertos到stm32 f103 的基本流程和总结
为什么要在stm32 f103上面移植freertos stm32 f103 以他的全面的文档,亲民的价格,强大的功能.成为无数微设备的方案首选.在市场上有极大的使用量.市场占有率也是非常的高.f ...
- Python3(九) 闭包
一. 一切皆对象 函数式编程并没有标准定义,如果代码非常繁琐则考虑使用. 学习闭包的概念,不是python独有的. 其他大多数语言中的函数只是一段可执行的代码,并不是对象. python中的函数是对象 ...
- php面试笔记(4)-php基础知识-流程控制
本文是根据慕课网Jason老师的课程进行的PHP面试知识点总结和升华,如有侵权请联系我进行删除,email:guoyugygy@163.com 在面试中,考官往往喜欢基础扎实的面试者,而流程控制相关的 ...
- 还是端口回流问题 TCP协议解析
还是上一篇的问题 在一内部局域网中, client 内网地址为 10.0.0.2 web 服务器内网地址为 10.0.0.1 外网地址为 211.6.15.1 域名为 xx ...
- Spring源码阅读笔记02:IOC基本概念
上篇文章中我们介绍了准备Spring源码阅读环境的两种姿势,接下来,我们就要开始探寻这个著名框架背后的原理.Spring提供的最基本最底层的功能是bean容器,这其实是对IoC思想的应用,在学习Spr ...
- 如何在GitHub预览html
1.在GitHub中找到需要预览的html文件,点击settings 2.找到GitHub Pages,将其中的source改为master branch,此时出现了下图中的红色链接,打开一个新的网页 ...
- bootstrap的自适应 和细节点
bootstrap的自适应尽量少用绝对宽度px来定义大小,这会导致缩小屏幕宽度时相冲突,多使用百分比来改变位置.. 遇到不能用margin和padding来改变位置时,首先应该想到绝对定位和相对定位( ...
- ES6学习笔记(二):教你玩转类的继承和类的对象
继承 程序中的继承: 子类可以继承父类的一些属性和方法 class Father { //父类 constructor () { } money () { console.log(100) } } c ...
- 一篇文章带你搞定 ElasticSearch 术语
这篇文章主要介绍 ElasticSearch 的基本概念,学习文档.索引.集群.节点.分片等概念,同时会将 ElasticSearch 和关系型数据库做简单的类比,还会简单介绍 REST API 的使 ...
- java设计模式学习笔记——里氏替换原则
oo中的继承性的思考和说明 1.继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有的子类必须遵循这些七月,但是如果子类对这些已经实现的方法任意修改,就会对 ...