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;
}

转载于:https://www.cnblogs.com/coder-Uranus/p/9742191.html

Luogu P1462 通往奥格瑞玛的道路(最短路+二分)相关推荐

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

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

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

    题目描述 在艾泽拉斯,有n个城市.编号为1,2,3,...,n. 城市之间有m条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联盟的攻击,进而损失一定的血量. 每次经过一个城市,都会被收取 ...

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

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

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

    P1462 通往奥格瑞玛的道路https://www.luogu.com.cn/problem/P1462  一道很不错的题,考察了二分和最短路 #include <iostream> # ...

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

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

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

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

  7. P1462 通往奥格瑞玛的道路

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

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

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

  9. P1462 通往奥格瑞玛的道路(二分 迪杰斯特拉 最短路 + spfa最短路算法)

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

最新文章

  1. XMLHttpRequest
  2. python不需要缩进的代码顶行编写_python程序快速缩进多行代码方法总结
  3. eigen3.3.8帮助文档下载 chm_MAXHUB文档v1.10.1-MAXHUB文档电脑版下载
  4. .NET Remoting开发系列:(三) Remoting服务发布方式
  5. 查询oracle 表达小,oracle中sql语句小练习(使用连接查询)
  6. 需求调研计划_Mysteel调研:需求持续放量工业线材下游调研
  7. string的insert
  8. 克隆虚拟主机后的主机如何联网!!!!
  9. ➤mobi➢azw3➢epub⇨电子书阅读器 转换器
  10. win10pe命令打开计算机,Win10是怎么进入安全模式
  11. 修改手机定位 之 Fake Location 软件使用教程
  12. java导出excel_Java使用poi组件导出Excel格式数据
  13. JDK动态代理过程中报错interface ** is not visible from class loader
  14. UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xb5 in position 2: invalid start byte
  15. 初学51单片机制作智能小车心得
  16. 程序猿必知必会[EP1]MD5算法
  17. VCS第一讲:vcs和verdi演示一个简单的验证case
  18. QGIS 3.10 矢量样式设置
  19. axios获取html页面,axios 获取后台数据
  20. C++ 语言禁止派生类 - final specifier

热门文章

  1. JSON日期格式转换
  2. 大学不教的20小时定律,10分钟学会受用终身
  3. 目前最流行的开发模式DevOps究竟是什么鬼?
  4. 宿迁中学2021高考成绩查询,江苏省宿迁中学举行2021届高三学生高考出征大会
  5. 也来“玩”Metro UI之磁贴(二)
  6. 函数 RFC 函数 BAPI
  7. docker部署yearning
  8. Linux服务器怎样上传下载文件
  9. MongoDB学习(三)-- 增删改
  10. android 跑步传感器,真正的跑者福音?—RunScribe智能跑步传感器