洛谷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 通往奥格瑞玛的道路
在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目背景 [题目描述:] 在艾泽 ...
随机推荐
- 跟着 GPT-4 从0到1学习 Golang 并发机制(二)
btw: 我的个人博客网站 目录 一.前言 二.开聊 2.1 Golang 中的 sync 包 - Mutex, RWMutex 和 WaitGroup 2.2 条件变量 sync.Cond 2.3 ...
- 【git】基于JGit通过ssh-url拉取指定commit-id的代码
实现 1️⃣ pom依赖: <dependency> <groupId>org.eclipse.jgit</groupId> <artifactId>o ...
- Centos7下创建Oracle用户
Centos7下创建Oracle用户 Oracle中,一个用户其实就类似于一个数据库,本次就来创建一个新用户 登录 将系统用户切换到oracle用户下 su - oracle -- 启动sqlplus ...
- OlllyDbg调试器和IDA调试器
OllyDbg调试器 OllyDbg称为Ring3级的首选工具.可以识别数千个被和Windows频繁使用的函数,并能将其注释出来.它会自动分析函数过程.循环语句等 OllyDbg主界面 快捷键 Add ...
- quarkus实战之四:远程热部署
将本地的改动极速同步到远程服务端,并自动生效,掌握此技能,开发调试会更高效 欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/ ...
- 简单的python3脚本:从日志中提取信息
命名:log_extractor.py or download_stats_extractor.py # coding:utf-8 #!/usr/bin/python3 def filter_line ...
- mysql根据.frm和.ibd文件恢复数据表
忠人之事受人之托 起因是因为一位朋友的数据库服务器被重装了,只剩下一个zbp_post.frm和zbp_post.ibd文件.咨询我能不能恢复,确实我只用过mysqldump这种工具导出数据 然后进行 ...
- DXP TreeList 目录树
DXP TreeList 目录树 1.需求背景 需要一个支持勾选,拖动节点,保存各节点顺序的目录树. 2.创建目录树 在treeList控件中添加两个colunm 用来显示绑定数据和显示值. 接下来对 ...
- redux的三个概念与三大核心
1.什么是redux?一个组件里可能会有很多的状态,比如控制某个内容显示的flag,从后端获取的展示数据,那么这些状态可以在自己的单个页面进行管理,也可以选择别的管理方式,redux就是是一种状态管理 ...
- 优化nginx参数(基本通用参数)
全局域配置参数 worker_processes auto; worker_cpu_affinity auto; worker_rlimit_nofile 65530; 前两个参数用于开启nginx多 ...