P1462 通往奥格瑞玛的道路

题面

题目背景

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

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

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

题目描述

在艾泽拉斯,有 \(n\) 个城市。编号为 \(1,2,3,...,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 ai, bi \leq n)\) 。表示城市 \(a_i\) 和城市 \(b_i\) 之间有一条公路,如果从城市 \(a_i\) 到城市 \(b_i\) ,或者从城市 \(b_i\) 到城市 \(a_i\) ,会损失 \(c_i\) 的血量。

输出格式:

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

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

输入输出样例

输入样例:

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

输出样例:

10

说明

对于 $60 % $ 的数据,满足 \(n \leq 200,m \leq 10000,b \leq 200\)

对于 $100 % $ 的数据,满足 \(n \leq 10000, m \leq 50000, b \leq 1000000000\)

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

思路

要是你帮我把这题改对了我就叫你 \(100\) 声爹。 --Mercury

然后我改了一行,水星就叫了我 \(100\) 声爹 \(qwq\) 。

给上他的博客地址: 洛谷 P1951 收费站_NOI导刊2009提高(2) 最短路+二分

这题其实并不难,枚举最多交费,然后跑最短路,看 \(dis[n]\) 是否 $ \leq b$ ,然后来更新二分的区间就可以做出来了。

在这里的话我主要枚举水星犯的错误:

一、看错题目

这道题和P1951其实是重题,水星先写的P1951。而那道题无解时输出 -1 而非 AFK ,所以水星就写挂了。

二、二分写挂了

一开始的时候水星是这么写的:

while(l<r)
{
int mid=(l+r)>>1;
Dijkstra(mid);
if(dis[n]>W) l=mid+1;
else r=mid;
if(dis[n]!=INT_MAX/2) b=true;
}

在这里先说明一下,他的距离数组是以 INT_MAX/2 来初始化的, \(bool\) 变量 b 用来记录有没有可行答案。

然后他改了一下:

do
{
int mid=(l+r)>>1;
Dijkstra(mid);
if(dis[n]>W) l=mid+1;
else r=mid;
if(dis[n]!=INT_MAX/2) b=true;
}while(l<r);

然而正确的写法是:

do
{
int mid=(l+r)>>1;
Dijkstra(mid);
if(dis[n]>W) l=mid+1;
else r=mid,b=true;
}while(l<r);

二分是真的容易写挂!之前写的树链剖分二分都没有一次性写对。在这里推荐一篇很好的参考博客,供大家学习:

[曦行夜落]浅谈二分的边界问题

AC代码

#include<bits/stdc++.h>
typedef long long LL;
const LL maxn=10010;
const LL maxm=50010;
const LL INF=0x7fffffff;
using namespace std; LL n,m,W,wt[maxn];
LL tot,to[maxm<<1],nxt[maxm<<1],head[maxn],len[maxm<<1];
LL l,r,dis[maxn];
priority_queue< pair<LL,LL> > q;
bool vis[maxn],b; void Dijkstra(LL mx)
{
for(LL i=1;i<=n;i++) dis[i]=INF;
for(LL i=1;i<=n;i++) vis[i]=false;
dis[1]=0;
q.push(make_pair(0,1));
while(!q.empty())
{
LL u=q.top().second;
q.pop();
if(vis[u]) continue;
vis[u]=true;
for(LL i=head[u];i;i=nxt[i])
{
LL v=to[i];
if(wt[v]>mx) continue;
if(dis[u]+len[i]<dis[v])
{
dis[v]=dis[u]+len[i];
q.push(make_pair(-dis[v],v));
}
}
}
} int main()
{
scanf("%lld%lld%lld",&n,&m,&W);
for(LL i=1;i<=n;i++)
{
scanf("%lld",&wt[i]);
r=max(r,wt[i]);
}
for(LL i=1;i<=m;i++)
{
LL u,v,w;scanf("%lld%lld%lld",&u,&v,&w);
to[++tot]=v;nxt[tot]=head[u];len[tot]=w;head[u]=tot;
to[++tot]=u;nxt[tot]=head[v];len[tot]=w;head[v]=tot;
}
l=max(wt[1],wt[n]);
do
{
LL mid=(l+r)>>1;
Dijkstra(mid);
if(dis[n]>W) l=mid+1;
else b=true,r=mid;
}while(l<r);
if(b) printf("%lld",r);
else printf("AFK");
return 0;
}

Luogu P1462 通往奥格瑞玛的道路(最短路+二分)的更多相关文章

  1. P1462 通往奥格瑞玛的道路[最短路+二分+堆优化]

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

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

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

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

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

  4. Luogu P1462 通往奥格瑞玛的道路【二分/最短路】

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

  5. Luogu P1462 通往奥格瑞玛的道路 二分答案+最短路

    先二分答案,再跑最短路,跑的时候遇到 过路费超过二分的答案的 就不拿他更新最短路 #include<cstdio> #include<iostream> #include< ...

  6. P1462 通往奥格瑞玛的道路 最短路

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

  7. 【luogu P1462 通往奥格瑞玛的道路】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1462 记住HP=0也叫死. #include <queue> #include <cstd ...

  8. 洛谷1462 通往奥格瑞玛的道路 最短路&&二分

    SPFA和二分的使用 跑一下最短路看看能不能回到奥格瑞玛,二分收费最多的点 #include<iostream> #include<cstdio> #include<cs ...

  9. luogu P1462 通往奥格瑞玛的道路

    嘟嘟嘟 这道题的题面相当的迷,我看了半天都没懂.最后看了题解的解释才懂. 他是这么个意思:对于所有能活着走到终点的路径,输出每一条路径中过路费最多的城市的最小值. 那么自然想到二分过路费,然后用dij ...

随机推荐

  1. Java之RabbitMQ(二)多mq配置

    场景: springboot单项目,自身使用mq中间件处理一些业务需求,某些业务上又需要消费第三方mq消息,这时候需要我们单项目中配置多套mq,这时候,需要我们自定义多套mq相关连接工厂.模板.监听工 ...

  2. flexbox属性速览及常见布局实现

    CSS3 弹性盒子(Flex Box)弹性盒子是即 CSS2 浮动布局后, CSS3 的一种新的布局模式. CSS3 弹性盒( Flexible Box 或 flexbox),是一种当页面需要适应不同 ...

  3. appium + python 自动化调试手机时 UiAutomator exited unexpectedly with code 0, signal null

    放上appium报错图,appium在手机里安装了appium setting 和unlock 软件,输入法也被变成了appium input ,但是就是点不到目标软件,手机也可以被cmd  adb ...

  4. JS时间比较大小

    目录 1. 时间比较 2. 时间戳比较 3. 日期比较方法 4. 参考 1. 时间比较 var curTime = new Date(); //把字符串格式转化为日期类 var starttime = ...

  5. 控制类名(className 属性)设置或返回class属性

    控制类名(className 属性) className 属性设置或返回元素的class 属性. 语法: object.className = classname 作用: 1.获取元素的class 属 ...

  6. ubuntu解压/压缩rar文件

    一般通过默认安装的ubuntu是不能解压rar文件的,只有在安装了rar解压工具之后,才可以解压.其实在ubuntu下安装rar解压工具是非常简单的,只需要两个步骤就可以迅速搞定.ubuntu 下ra ...

  7. Python-函数基础(1)

    目录 函数定义 什么是函数? 定义函数三种形式 函数定义的特性 函数调用 函数返回值 return的特性: 函数的参数 有参函数 形参 位置形参 默认形参 实参 位置实参 关键字实参 可变长参数 形参 ...

  8. 2-sat——输出方案poj3683

    一篇讲的详细的博客 https://blog.csdn.net/Hawo11/article/details/74908233 缩点后为什么要建立反图? 如果是按原图处理,选择一个点之后要把所有其后续 ...

  9. CF148D Bag of mice (期望dp)

    传送门 # 解题思路 ​    ~~这怕是本蒟蒻第一个独立做出来的期望$dp$的题,发篇题解庆祝一下~~.首先,应该是能比较自然的想出状态设计$f[i][j][0/1]$ 表示当前还剩 $i$个白老鼠 ...

  10. vue + element-ui实现简洁的导入导出功能

    1.安装ElementUI模块 cnpm install element-ui -S 2.在main.js中引入 import ElementUI from 'element-ui' import ' ...