洛谷P1462spfa + 二分答案
第一次接触二分答案的题目最开始是没有思路的看了一个题解,然后强行理解之后开始自己打了一遍,然而结果是只得了30分过了3个点其他全wa,之后是漫长的debug,这里想感慨一句自己debug的速度是真慢。先把题目之间拉过来吧。
通往奥格瑞玛的道路
题目背景
在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量。
有一天他醒来后发现自己居然到了联盟的主城暴风城。
在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛。
题目描述
在艾泽拉斯,有 \(n\) 个城市。编号为 \(1,2,3,\ldots,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 a_i,b_i\leq n\))。表示城市 \(a_i\) 和城市 \(b_i\) 之间有一条公路,如果从城市 \(a_i\) 到城市 \(b_i\),或者从城市 \(b_i\) 到城市 \(a_i\),会损失 \(c_i\) 的血量。
输出格式
仅一个整数,表示歪嘴哦交费最多的一次的最小值。
如果他无法到达奥格瑞玛,输出 AFK。
样例 #1
样例输入 #1
4 4 8
8
5
6
10
2 1 2
2 4 1
1 3 4
3 4 3
样例输出 #1
10
提示
对于 \(60\%\) 的数据,满足 \(n\leq 200\),\(m\leq 10^4\),\(b\leq 200\);
对于 \(100\%\) 的数据,满足 \(n\leq 10^4\),\(m\leq 5\times 10^4\),\(b\leq 10^9\);
对于 \(100\%\) 的数据,满足 \(c_i\leq 10^9\),\(f_i\leq 10^9\),可能有两条边连接着相同的城市。
思路:
几个关键点和题目的理解
1、 我们有两个关键的量,一个是血量,另一个是金钱。
2、在可以到达奥格瑞玛的情况下,他所经过的所有城市中最多的一次收取的费用的最小值是多少对于这句话的理解,就是我们先有一条能到达终点的路径,在这个路径上我们找到这条路径上收取费用最多的城市。然后能到终点的路径有多条,所以这个收取费用最多的城市也有多个,我们要找到的就是最小的那一个。
3、我们如果要枚举每一个答案的话时间复杂度就是n,而最短路算法的时间复杂度,dijistkal是nlogn,而spfa出题人不卡的话一般是km, k为常数,如果出题人卡数据的话会退化为mn,暴力枚举的话时间复杂度就是n^2logn或者nm,是过不了的,
4、题目中出现最大值最小,一般考虑二分答案,这是我们看一下答案是否是具有单调性的呢,(目前还没想清楚单调性是怎么回事)
还要说一下自己打代码过程和debug中找到自己的问题,1、数据范围边界设置的不合理因为题目中的数据大于int这时设置正无穷就应该更大.而且需要注意会爆int 2、spfa的模版不熟悉还是有不理解的地方,比如使用队列中的点去进行松弛操作,更新它能更新的所有点这一点自己写的时候却写错了,而且看了好多遍竟然都没发现,最后才找到。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
using namespace std;
typedef long long ll;
const ll N = 1e5 + 10, M = 1e6 + 10, INF = 0x7fffffff;
//用来跑最短路
bool inq[N], vis[N];
ll a[N], l, r;
ll n, m, hp;
ll dist[N];
//链式前向星
ll h[N], e[N], ne[N], w[N], idx;
void add(ll a, ll b, ll c)
{
w[idx] = c; e[idx] = b; ne[idx] = h[a]; h[a] = idx ++;
}
//spfa算法
bool spfa(ll x)
{
for(ll i = 1; i <= n ; ++ i)
{
inq[i] = false;
if(a[i] <= x) vis[i] = false;
else vis[i] = true;
}
for(int i = 2; i <= n; ++ i) dist[i] = 0x7fffffff;
queue<ll> q;q.push(1);inq[1] = true;
while(q.size())
{
ll t = q.front();q.pop();
if(vis[t]) continue;
inq[t] = false;
for(ll i = h[t]; i != -1; i = ne[i])
{
ll j = e[i];
if(vis[j]) continue;
if(dist[j] > dist[t] + w[i])
{
dist[j] = dist[t] + w[i];
if(!inq[j])
{
q.push(j);
inq[j] = true;
}
}
}
}
return dist[n] <= hp;
}
int main()
{
//文件读入数据
freopen("1.in.txt","r",stdin);
//初始化表头
memset(h, -1, sizeof h);
scanf("%lld%lld%lld", &n, &m, &hp);
for(ll i = 1; i <= n; ++ i) {scanf("%lld", &a[i]); r = max(r, a[i]);}
for(ll i = 1; i <= m; ++ i)
{
ll a, b, c;scanf("%lld%lld%lld", &a, &b, & c);
add(a, b, c); add(b, a, c);
}
//当最短路不存在时我们直接输出AFK返回;
if(!spfa(1000000005))
{
cout << "AFK" << endl;
return 0;
}
//二分答案,找到能跑最短路的最小的答案,大于答案的点是不能走到的点在跑最短路时这些点不能经过
while(l < r)
{
ll mid = (l + r ) >> 1;
if(spfa(mid)) r = mid;
else l = mid + 1;
}
cout << l;
return 0;
}
关于spfa算法
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 1e5 + 10, M = 2 * N;
int n, m;
int h[N], e[M], w[M], ne[M], idx;
void add(int a, int b, int c)
{
w[idx] = c; e[idx] = b; ne[idx] = h[a]; h[a] = idx ++;
}
int d[N];
bool inq[N];
void spfa()
{
queue<int> q;
memset(d, 0x3f, sizeof d);
memset(inq, 0, sizeof inq);
d[1] = 0; q.push(1); inq[1] = 1;
while(q.size())
{
auto t = q.front(); q.pop(); inq[t] = 0;
for(int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
if(d[j] > d[t] + w[j])
{
d[j] = d[t] + w[j];
if(!inq[j])
{
inq[j] = 1;
q.push(j);
}
}
}
}
}
int main()
{
memset(h, -1, sizeof h);
cin >> n >> m;
for(int i = 1; i <= m; ++ i)
{
int a, b, c; cin >> a >> b >> c;
add(a, b, c);
}
spfa();
return 0;
}
洛谷P1462spfa + 二分答案的更多相关文章
- 洛谷P2402 奶牛隐藏(网络流,二分答案,Floyd)
洛谷题目传送门 了解网络流和dinic算法请点这里(感谢SYCstudio) 题目 题目背景 这本是一个非常简单的问题,然而奶牛们由于下雨已经非常混乱,无法完成这一计算,于是这个任务就交给了你.(奶牛 ...
- 洛谷CF1071E Rain Protection(计算几何,闵可夫斯基和,凸包,二分答案)
洛谷题目传送门 CF题目传送门 对于这题,我无力吐槽. 虽然式子还是不难想,做法也随便口胡,但是一些鬼畜边界情况就是判不对. 首先显然二分答案. 对于每一个雨滴,它出现的时刻我们的绳子必须落在它上面. ...
- 洛谷P4344 脑洞治疗仪 [SHOI2015] 线段树+二分答案/分块
!!!一道巨恶心的数据结构题,做完当场爆炸:) 首先,如果你用位运算的时候不小心<<打成>>了,你就可以像我一样陷入疯狂的死循环改半个小时 然后,如果你改出来之后忘记把陷入死循 ...
- [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)
[CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...
- [NOIP2015提高&洛谷P2678]跳石头 题解(二分答案)
[NOIP2015提高&洛谷P2678]跳石头 Description 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之 ...
- [NOIP提高&洛谷P1024]一元三次方程求解 题解(二分答案)
[NOIP提高&洛谷P1024]一元三次方程求解 Description 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约 ...
- 分数规划模板(洛谷P4377 [USACO18OPEN]Talent Show)(分数规划,二分答案,背包)
分数规划是这样一个东西: 给定若干元素,每个元素有两个属性值\(a_i,b_i\),在满足题目要求的某些限制下选择若干元素并求出\(\frac{\sum a}{\sum b}\)的最大值. 如果没有限 ...
- 洛谷P1084 疫情控制(NOIP2012)(二分答案,贪心,树形DP)
洛谷题目传送门 费了几个小时杠掉此题,如果不是那水水的数据的话,跟列队的难度真的是有得一比... 话说蒟蒻仔细翻了所有的题解,发现巨佬写的都是倍增,复杂度是\(O(n\log n\log nw)\)的 ...
- 洛谷P4382 [八省联考2018]劈配(网络流,二分答案)
洛谷题目传送门 说不定比官方sol里的某理论最优算法还优秀一点? 所以\(n,m\)说不定可以出到\(1000\)? 无所谓啦,反正是个得分题.Orz良心出题人,暴力有70分2333 思路分析 正解的 ...
- 【洛谷】【二分答案+最短路】P1462 通往奥格瑞玛的道路
在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目背景 [题目描述:] 在艾泽 ...
随机推荐
- CentOS 30分钟部署免费在线客服系统
前段时间我发表了一系列文章,开始介绍基于 .net core 的在线客服系统开发过程.期间有一些朋友希望能够给出 Linux 环境的安装部署指导,本文基于 CentOS 7.9 来安装部署. 我详细列 ...
- 使用Locust进行分布式性能测试
Locust是一个强大的性能测试工具,用于评估系统的性能和可扩展性.本文将简洁地介绍使用Locust进行分布式性能测试的步骤和优势. 步骤: 1. 配置测试环境:在主节点和多个从节点上安装相同版本的L ...
- zabbix 中 net.if.out 值来源及persecond的计算
使用脚本记录每秒的net.if.out值,与zabbix中的lastdata值做对比,发现对不上. #!/bin/bash dev=eth0 get_dev_net_speed() { dev_inf ...
- IIC、SPI、UART三者对比
下面将对比三者的各自差异: 参考资料: 1.(112条消息) UART, SPI, IIC的详解及三者的区别和联系_iic spi uart_静思心远的博客-CSDN博客
- return true 与 return false的妙用——jQuery
var arr = [1, 3, 5,7,9]; jQuery.each(arr, function(key, value){ if(key === 2){ return true; } consol ...
- 堆 Heap & 栈 Stack(.Net)【概念解析系列_3】【C# 基础】
〇.前言 本文主要围绕 .Net 框架中的托管堆(Heap,简称堆)和堆栈(Stack,简称栈)展开. .Net 程序在 CLR(Common Language Runtime 公共语言运行时)上运行 ...
- 不想引入mq?试试debezium
有句话叫做"如无必要,勿增实体". 在一些小型项目当中,没有引入消息中间件,也不想引入,但有一些业务逻辑想要解耦异步,那怎么办呢? 我们的web项目,单独内网部署,由于大数据背景, ...
- golang trace view 视图详解
大家好,我是蓝胖子,在golang中可以使用go pprof的工具对golang程序进行性能分析,其中通过go trace 命令生成的trace view视图对于我们分析系统延迟十分有帮助,鉴于当前对 ...
- Linux:通过ssh访问虚拟机
好记性抵不过烂笔头.(过段时间用的时候,总要百度一下,别费这个时间了) 语法: ssh -p port username@IP #默认22端口,可省略"-p port",即:ssh ...
- 论文解读(SentiX)《SentiX: A Sentiment-Aware Pre-Trained Model for Cross-Domain Sentiment Analysis》
Note:[ wechat:Y466551 | 可加勿骚扰,付费咨询 ] 论文信息 论文标题:SentiX: A Sentiment-Aware Pre-Trained Model for Cross ...