题目背景

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

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

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

题目描述

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

输出格式

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

如果他无法到达奥格瑞玛,输出\(\text{AFK}\)。

输入输出样例

输入 #1

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

输出 #1

10

说明/提示

对于\(60%\)的数据,满足\(n \le 200,m \le 10^4,b \le 200\)

对于\(100%\)的数据,满足\(n \le 10^4\),\(m \le 5 \times 10^4\),\(b \le 10^9\),满足\(c_i \le10^9,f_i \le 10^9\),可能有两条边连接着相同的城市。

血量为0的时候,视为可以通过.


解题报告

题意理解

这道题目,让我们满足两个条件.

  1. 血量充足,也就是路径消耗要小于血量最大值.

  2. 这条路径上经过的点,最大点权最小.

  3. 从起点到终点


算法解析

如果说排除,血量因素,这道题目是非常显然的最短路径问题.

但是我们现在多了一个限制条件,那么该如何是好?

我们知道,如果说我们的最终答案是\(x_1\),也就是说答案路径上最大点的点权为\(x_1\).

现在有一个值\(x_2\),表示限制目标答案路径上最大点的点权为\(x_2\)

\[若x_1<x_2,显然x_2这个条件是可以满足的
\]

同理,我们也可以推断出.

\[若x_1>x_2,显然x_2这个条件是无法满足的,因为题目的答案是x_1,而不是x_2.
\]

综上所述,我们不难得出结论.

这道题目可以,二分最大点权,也就是二分答案

既然如此,我们的判断\(check\)函数,如何处理呢?

我们可以用最短路算法作为判断.以血量作为权值.

转移,则是满足.这条边抵达的终点\(y\),需要满足\(y<=mid\)

然后这道题目就这样解决了.


代码解析

#include <bits/stdc++.h>
using namespace std;
const int N=1e4+20,M=5e4+20;
#define int long long//这道题目数据范围有点大,所以为了抱歉,我们选择long long
int n,m,b,f[N],l,r,head[M],edge[M<<1],Next[M<<1],ver[M<<1],tot,vis[N],dis[N];
inline int Spfa(int mid)
{
memset(vis,false,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
queue<int> q;
q.push(1);
dis[1]=0;
if (f[1]>mid)//初始点也要判断
return false;
while(q.size())
{
int now=q.front();
q.pop();
vis[now]=false;
for(int i=head[now]; i; i=Next[i])
{
int y=edge[i],w=dis[now]+ver[i];
if (dis[y]>w && f[y]<=mid)//目标点点权不可以大于限制值
{
dis[y]=w;
if (!vis[y])
{
q.push(y);
vis[y]=1;
}
}
}
}
return dis[n]<=b;//需要满足血量花费不可以大于最大花费
}
inline void add_edge(int a,int b,int c)
{
edge[++tot]=b;
ver[tot]=c;
Next[tot]=head[a];
head[a]=tot;
}
inline void init()
{
scanf("%lld%lld%lld",&n,&m,&b);
for(int i=1; i<=n; i++)
{
scanf("%lld",&f[i]);
r=max(f[i],r);//最大点权
}
for(int i=1; i<=m; i++)
{
int a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
add_edge(a,b,c);
add_edge(b,a,c);//建立无向图
}
while(l<r)//二分
{
int mid=l+r>>1;
if (Spfa(mid))
r=mid;
else
l=mid+1;
}
if (!Spfa(r))//无解
puts("AFK");
else
printf("%lld\n",r);
}
signed main()
{
init();
return 0;
}

洛谷P1462 通往奥格瑞玛的道路(SPFA+二分答案)的更多相关文章

  1. 洛谷 P1462 通往奥格瑞玛的道路(二分答案,堆优化dijkstra)

    传送门 解题思路 首先看题目问题,求经过的所有城市中最多的一次收取的费用的最小值是多少.一看“最大值最小”就想到了二分答案. 在读一遍题目,就是二分收取的费用,然后对于每一个二分的费用,跑一边最短路, ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. 洛谷 P1462 通往奥格瑞玛的道路——二分+spfa

    上一波链接 https://www.luogu.org/problem/P1462 这道题我们考虑二分答案 然后每次跑一次spfa判断是否能够到达n点 tips:在不考虑负权边的前提下我们写最短路最好 ...

  9. 洛谷P1462通往奥格瑞玛的道路——二分答案最短路

    题目:https://www.luogu.org/problemnew/show/P1462 最大值最小问题,二分答案. 代码如下: #include<iostream> #include ...

随机推荐

  1. 使用FRP配置Windows远程控制

    一款很好用的内网穿透工具--FRP 前言 使用内网穿透工具--FRP,以及一台云服务器当做服务端,进行简单配置后即可远程访问 配置 FRP 服务端的前提条件是需要一台具有公网 IP 的设备,得益于 F ...

  2. mysql5.6.36 编译报错make[1]: *** [storage/perfschema/unittest/CMakeFiles/pfs_connect_attr-t.dir/all]..

    cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysqldb -DMYSQL_UNIX_ADDR=/tmp/m ...

  3. 搭建IIS CA DC Exchange TMG SQL (CA DC篇)

    搭建IIS CA DC Exchange TMG SQL (CA DC篇)   步骤 1: 在“下一步(N) > (按下按钮)”(位于“添加角色向导”中)上用户左键单击   步骤 2: 在“Ac ...

  4. 思科S系列220系列交换机多个漏洞预警

    补天漏洞响应平台近期监测思科官方发布了关于思科 S 系列 220 系列交换机的3个漏洞修复通告,其中包含2个高危漏洞,最高CVSS 3.0评分9.8. 更新时间 2019年 08月 09日 威胁目标 ...

  5. python一些小知识点is和编码

    dic = { "name":["alex", "wusir", "taibai"], 'py9':{ "ti ...

  6. js复制文本

    第一种: 自己测试时 只适合于input 和textarea 但是针对于其他标签的复制就不能用了.代码如下: <!DOCTYPE html> <html> <head&g ...

  7. orcale备份语句

    1.创建一个文件夹,比如d盘下创建一个expdp的文件夹 d:\expdp2.使用一个用户,必须具有DBA权限 比如 sqlplus /nolog conn system/password@数据库连接 ...

  8. .Net Core 3.0原生Json解析器

    微软官方博客中描述了为什么构造了全新的Json解析器而不是继续使用行业准则Json.Net 微软博客地址:https://devblogs.microsoft.com/dotnet/try-the-n ...

  9. SpringBoot导入mail依赖报错

    报错:Missing artifact org.springframework.boot:spring-boot-starter-mail:jar:2.0.3 之前导入log4j时报的一样的错误,最后 ...

  10. 如何判断你的windows系统是32位还是64位?

    [学习笔记] 如 何判断你的windows系统是32位还是64位? java -version时,如果没有64就是32位的.eclipse.ini中如果没有64,就是32位的.但是我们的ini文件里面 ...