【NOI导刊200908模拟试题02 题4】【二分+Dijkstra】 收费站
Description
在某个遥远的国家里,有n个城市。编号外1,2,3,…,n。
这个国家的政府修建了m条双向的通路。每条公路连接着两个城市。沿着某条公路,开车从一个城市到另一个城市,需要花费一定的汽油。
开车每经过一个城市,都会被收取一定的费用(包括起点和终点城市)。所有的收费站都在城市中,在城市间的公路上没有任何收费站。
小红现在要开车从城市u到城市v(1<=u,v<=n)。她的车最多可以装下s升的汽油。在出发的时候,车的邮箱是满的,并且她在路上不想加油,即从城市u到城市v的过程中,她都不加油。
在路上,每经过一个城市,她要交一定的费用。如果她某次交的费用比较多,她的心情就会变得很糟。所以她想知道,在她能到达目的地的前提下,她交的费用中最多的一次最少是多少。这个问题对于她来说太难了,于是她找到了聪明的你,你能帮她吗?
Input
第一行5个正整数n,m,u,v,s
接下来有n行,每行1个正整数fi表示经过城市i,需要交费fi元。
再接下来有m行,每行3个正整数ai,bi,ci(1<=ai,bi<=n),表示城市ai和城市bi之间有一条公路,如果从城市ai到城市bi,或者从城市bi到城市ai,需要ci升汽油
Output
仅一个整数,表示小红交费最多的一次的最小值。
如果她无法到达城市v,输出-1。
Sample Input
输入样例1
4 4 2 3 8
8
5
6
10
2 1 2
2 4 1
1 3 4
3 4 3 输入样例2:
4 4 2 3 3
8
5
6
10
2 1 2
2 4 1
1 3 4
3 4 3
Sample Output
输出样例1:
8 输出样例2:
-1
Hint
数据规模:
对于60%的数据,满足n≤200,m≤10000,s≤200
对于100%的数据,满足n≤10000,m≤50000,s≤1 000 000 000
对于100%的数据,满足ci≤1 000 000
000,fi≤1 000 000 000
可能有两条边连接着相同的城市
考虑二分答案 则对于每次二分的值 S
将图中端点的收费大于S 的边删去
如果以油量为权跑完最短路 d[v]的值大于总油量则这次二分的值不是答案
以此扩展
因为数据过大 且SPFA容易被卡 边权无负 我们选择Dijkstra算法来检查

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<map>
#define LL long long
#define f(a,b,c) for(long long i = (a); i <= (b); i += (c))
using namespace std;
long long n,m,u,v,s;
long long f[10000000],head[1000000];
long long a,b,t;
long long d[10000000],maxx;
map<pair<long long,long long >,bool>QWQ;
struct Edge{
long long next,final,value;
}e[10000000];
struct node{
long long to,value;
bool operator <(const node &QWQ) const
{
return value > QWQ.value;
}
};
inline void dis(long long ans)
{
memset(d,0x3f,sizeof(d));
d[u] = 0;
priority_queue<node> QAQ;
QAQ.push((node){u,0});
while(!QAQ.empty())
{
long long u_ = QAQ.top().to;
long long v_ = QAQ.top().value;
QAQ.pop();
if(f[u_] > ans) continue;
if(v_ != d[u_]) continue;
for(long long i = head[u_] ; i; i = e[i].next )
{
long long place = e[i].final;
long long w = e[i].value;
if(d[u_] + w < d[place])
{
d[place] = d[u_] + w ;
QAQ.push((node){place,d[place]});
}
}
}
}
void add_edge(long long begin,long long to,long long c)
{
e[++e[0].value].final = to;
e[e[0].value].value = c;
e[e[0].value].next = head[begin];
head[begin] = e[0].value;
}
int main()
{
scanf("%lld%lld%lld%lld%lld",&n,&m,&u,&v,&s);
f(1,n,1)
{
scanf("%lld",&f[i]);
maxx = max(f[i],maxx);
}
f(1,m,1)
{
scanf("%lld%lld%lld",&a,&b,&t);
if(!QWQ[make_pair(a,b)])
{
add_edge(a,b,t);
add_edge(b,a,t);
QWQ[make_pair(a,b)] = QWQ[make_pair(b,a)] = 1;
}
} long long l = max(f[u],f[v]),r = maxx+2;
dis(maxx);
while(l <= r)
{
long long mid = (l + r )/2;
dis(mid);
if(d[v] > s)
l = mid + 1;
else
r = mid ;
}
if(d[v] > s)
{
cout<< -1;
return 0;
}
return 0;
}
【NOI导刊200908模拟试题02 题4】【二分+Dijkstra】 收费站的更多相关文章
- NOI导刊 2018河南郑州游记
前言 本蒟蒻来自浙江的弱市弱校,因为不想两年\(OI\)一场空,以及想出去玩,所以与同届大佬一起报了\(NOI\)导刊,希望能留下点不错的记忆吧. \(Day\ 0\) \(10\)月\(1\)日 经 ...
- NOI导刊总结
NOI导刊总结 前两天去郑州,参加了什么NOI导刊的培训,然后就发现大佬是真的多,还十分意外的发现了一个事,清华北大是不是发笔记本和耳机,为啥三个老师的都一模一样... 这几天主要以讲.NOIP知识点 ...
- P1776 宝物筛选_NOI导刊2010提高(02)&& 多重背包二进制优化
多重背包, 要求 \(N\log N\) 复杂度 Solution 众所周和, \(1-N\) 之内的任何数可以由 \(2^{0}, 2^{1}, 2^{2} ... 2^{\log N}, N - ...
- P1774 最接近神的人_NOI导刊2010提高(02)
P1774 最接近神的人_NOI导刊2010提高(02) 关于此题为什么可以使用求逆序对的方法来做 假设一个数\(a_i\),且前\(i-1\)个数已经成为单调增的数列. 我们要从前\(a_1\)至\ ...
- 洛谷——P1966 火柴排队&&P1774 最接近神的人_NOI导刊2010提高(02)
P1966 火柴排队 这题贪心显然,即将两序列中第k大的数的位置保持一致,证明略: 树状数组求逆序对啦 浅谈树状数组求逆序对及离散化的几种方式及应用 方法:从前向后每次将数插入到bit(树状数组)中, ...
- 洛谷P1774 最接近神的人_NOI导刊2010提高(02) [2017年6月计划 线段树03]
P1774 最接近神的人_NOI导刊2010提高(02) 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门 ...
- [NOI导刊2010提高&洛谷P1774]最接近神的人 题解(树状数组求逆序对)
[NOI导刊2010提高&洛谷P1774]最接近神的人 Description 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某 ...
- 洛谷—— P1775 古代人的难题_NOI导刊2010提高(02)
P1775 古代人的难题_NOI导刊2010提高(02) 题目描述 门打开了,里面果然是个很大的厅堂.但可惜厅堂内除了中央的一张羊皮纸和一支精致的石笔,周围几具骷髅外什么也没有.难道这就是王室的遗产? ...
- 洛谷P1776 宝物筛选_NOI导刊2010提高(02)
P1776 宝物筛选_NOI导刊2010提高(02) 题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了, ...
随机推荐
- python socket zmq
本篇博客将介绍zmq应答模式,所谓应答模式,就是一问一答,规则有这么几条 1. 必须先提问,后回答 2. 对于一个提问,只能回答一次 3. 在没有收到回答前不能再次提问 上代码,服务端: #codin ...
- 华为在HDC2021发布全新HMS Core 6 宣布跨OS能力开放
[2021年10月22日·东莞]华为开发者大会 2021(Together)于今天正式开幕,华为在主题演讲中正式发布全新的HMS Core 6,向全球开发者开放7大领域的69个Kit和21,738个A ...
- JavaScript之原型与原型链
前言 ❝ JavaScript常被描述为一种「基于原型的语言」--每个对象都拥有一个「原型对象」,对象以其原型为模板.从原型继承属性和放法.原型对象也可能拥有原型,并从中继承属性和方法,一层一层以此类 ...
- mysql的一些配置操作
mysql的一些配置操作 一.背景 二.mysql配置 三.慢查询日志 1.命令行临时生效 2.配置文件修改永久生效 3.慢查询日志解释 4.mysqldumpdlow查看慢查询日志 四.查看索引为何 ...
- Noip模拟44 2021.8.19
比较惊人的排行榜 更不用说爆零的人数了,为什么联赛会这么难!!害怕了 还要再努力鸭 T1 Emotional Flutter 考场上没切掉的神仙题 考率如何贪心,我们把黑色的条延长$s$,白色的缩短$ ...
- 方阵里面的dp
打了一场luogu的信心赛,惊讶地发现我不会T2,感觉像这样在矩阵里面的dp看起来很套路的样子,但是仔细想想还是有很多需要注意的细节. 又想到之前貌似也考过一些类似的题目 然而我并没有改 ,于是打算补 ...
- DP秒思维
DP算法对于大部分题有着良好的能力,但有些题目我们要转换思维,不能直接的设具体的转态.... 最近做了两道秒题,在这里分享一下: https://ac.nowcoder.com/acm/contest ...
- Tenable Nessus 10.0.0 (Unix, Linux) -- #1 漏洞评估解决方案
请访问原文链接:https://sysin.org/blog/nessus-10/,查看最新版.原创作品,转载请保留出处. 作者:gc(at)sysin.org,主页:www.sysin.org 了解 ...
- 什么是操作系统fork()进程
1.fork()是创建进程函数. 2.c程序一开始,就会产生 一个进程,当这个进程执行到fork()的时候,会创建一个子进程. 3.此时父进程和子进程是共存的,它们俩会一起向下执行c程序的代码. 4. ...
- cloudstack部署
参考文档 https://blog.csdn.net/u012124304/article/details/80960504#Mysql_37 cloudstack的rpm包下载地址 http://d ...