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

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

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

题目背景

【题目描述:】

在艾泽拉斯,有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。

输入样例#:

输出样例#:

输入输出样例

【算法分析:】

问题可以看作:

给定一张图,给定边权和点权,给定一个最大边权,

问,从点1到点n的路径的总长度不大于最大边权时点权的最大值最小

假设一个最大值,问题就变成了

  求出一条经过的点的点权都不大于这个最大值的最短路径,并且这条最短路的长度小于最大边权(生命值为0就GG了)

好像可以二分答案,证一证它的单调性:

当一个数num被选为最大值的时候,如果存在一条“经过的点的点权都不大于这个最大值的最短路径,并且这条最短路的长度小于最大边权”

则num可以选为最大值。

当num变小时,可以经过的城市变少,可选的点数变少,受到的伤害便可能增多,

使受到的伤害尽可能大(但不能超过总生命值),最大的点权值就会尽可能小,

  故num不一定是最优解,所以从[l, mid]内寻找解

  当num作为最大值过小时,就要从[mid + 1, r]中寻找解.

也就是说这道题将伤害视作边权,二分点权最大值,跑最短路松弛的条件多加了一个:松弛的点的点权必须小于最大点权

每次跑完最短路后如果受到的伤害小于血量那么这个最大点权便是一个解.

【代码:】

 //通往奥格瑞玛的道路
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; const int MAXN = + ;
const int MAXM = + ;
const int INF = 0x3f3f3f3f; int n, m, blood;
int city[MAXN]; int edge_num, head[MAXN];
struct edge {
int len, to, next;
}h[MAXM * ]; inline void Add(int from, int to, int len) {
h[++edge_num].next = head[from];
h[edge_num].to = to, h[edge_num].len = len;
head[from] = edge_num;
} inline int read() {
int x = ; char ch = getchar();
while(ch < '' || ch > '') ch = getchar();
while(ch >= '' && ch <= '')
x = (x << ) + (x << ) + ch - , ch = getchar();
return x;
} int fro, rear;
int dis[MAXN], que[MAXN * ];
bool in_que[MAXN];
void SPFA(int money) {
for(int i = ; i <= n; i++) dis[i] = INF;
memset(in_que, , sizeof(in_que));
in_que[] = , dis[] = ;
que[fro = rear = ] = ;
while(fro <= rear) {
int x = que[fro++];
in_que[x] = ;
for(int i = head[x]; i; i = h[i].next) {
int l = h[i].len, y = h[i].to;
if(dis[x] + l < dis[y] && city[y] <= money) {
dis[y] = dis[x] + l;
if(!in_que[y]) in_que[y] = , que[++rear] =y;
}
}
}
} inline bool check(int money) {
SPFA(money);
return dis[n] < blood;
}
int main() {
int l = , r = ;
n = read(), m = read(), blood = read();
for(int i = ; i <= n; ++i) {
city[i] = read();
r = max(r, city[i]);
}
l = max(city[], city[n]);
for(int i = ; i <= m; ++i) {
int a, b, c;
a = read(), b = read(), c = read();
if(a != b) {
Add(a, b, c);
Add(b, a, c);
}
}
if(!check(r)) { puts("AFK"); return ; }
while(l <= r) {
int mid = (l + r) >> ;
if(!check(mid)) l = mid + ;
else r = mid - ;
}
printf("%d\n", l);
}

【洛谷】【二分答案+最短路】P1462 通往奥格瑞玛的道路的更多相关文章

  1. [最短路]P1462 通往奥格瑞玛的道路

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

  2. 洛谷P1462 通往奥格瑞玛的道路(二分+spfa,二分+Dijkstra)

    洛谷P1462 通往奥格瑞玛的道路 二分费用. 用血量花费建图,用单源最短路判断 \(1\) 到 \(n\) 的最短路花费是否小于 \(b\) .二分时需要不断记录合法的 \(mid\) 值. 这里建 ...

  3. P1462 通往奥格瑞玛的道路(二分答案+最短路)

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

  4. Luogu P1462 通往奥格瑞玛的道路(最短路+二分)

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

  5. 洛谷 P1462 通往奥格瑞玛的道路 解题报告

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

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

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

  7. luogu P1462 通往奥格瑞玛的道路--spfa+二分答案

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

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

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

  9. [Luogu P1462] 通往奥格瑞玛的道路 (二分答案+最短路径)

    题面 传送门:https://www.luogu.org/problemnew/show/P1462 Solution 这道题如果去除掉经过城市的收费.那么就是裸的最短路 但是题目要求经过城市中最多的 ...

  10. P1462 通往奥格瑞玛的道路 (二分+最短路)

    题目 P1462 通往奥格瑞玛的道路 给定\(n\)个点\(m\)条边,每个点上都有点权\(f[i]\),每条边上有边权,找一条道路,使边权和小于给定的数\(b\),并使最大点权最小. 解析 二分一下 ...

随机推荐

  1. springboot情操陶冶-web配置(八)

    本文关注应用的安全方面,涉及校验以及授权方面,以springboot自带的security板块作为讲解的内容 实例 建议用户可直接路由至博主的先前博客spring security整合cas方案.本文 ...

  2. Java并发专题(二)线程安全

    前言 随着时代的发展,CPU核数的增加和计算速度的提升,串行化的任务执行显然是对资源的极大浪费,掌握多线程是每个程序员必须掌握的技巧.但是同时多线程也是一把双刃剑,带来了共享资源安全的隐患.在本节会介 ...

  3. Asp.net的DataGrid实现列冻结(C#)

    # Asp.net的DataGrid实现列冻结(C#) 一.写在前面 列冻结即在拖动横向滚动条时,冻结的列会随着滚动条移动,使得该列不会因为拖动滚动条而被隐藏,呈现出仿佛冻结的效果.列冻结与表头冻结是 ...

  4. JQuery实现数组移除指定元素

    公式: 数组.splice($.inArray(元素,数组),数量); 实例: var arr = ['a','b','c','d']; arr.splice($.inArray('c',arr),1 ...

  5. [MySQL] explain中的using where和using index

    1. 查看表中的所有索引 show index from modify_passwd_log;  有两个 一个是id的主键索引 , 一个是email_id的普通索引 2. using index表示 ...

  6. C# 在PPT幻灯片中创建图表

    图表能够很直观的表现数据在某个时间段的变化趋势,或者呈现数据的整体和局部之间的相互关系,相较于大篇幅的文本数据,图表更增加了我们分析数据时选择的多样性,是我们挖掘数据背后潜在价值的一种更为有效地方式. ...

  7. 【Docker】基础学习及在.Net Core应用

    一.Docker基础 Docker 是一个开源的应用容器引擎,基于 Go 语言 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Linux 机器上 ...

  8. Python数据类型(python3)

    Python数据类型(python3) 基础数据类型 整型 <class 'int'> 带符号的,根据机器字长32位和64位表示的范围不相同,分别是: -2^31 - 2^31-1 和 - ...

  9. Windows中nvm使用

    介绍:在两个项目且使用的node版本不一样时,维护多个版本的node, 安装:下载安装目录:https://github.com/coreybutler/nvm-windows/releasesnvm ...

  10. 03-HTML的body标签(文本标签)学习

    <html> <head>  <title>HTML的body标签-文本标签学习</title>  <meta charset="utf ...