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】 收费站的更多相关文章

  1. NOI导刊 2018河南郑州游记

    前言 本蒟蒻来自浙江的弱市弱校,因为不想两年\(OI\)一场空,以及想出去玩,所以与同届大佬一起报了\(NOI\)导刊,希望能留下点不错的记忆吧. \(Day\ 0\) \(10\)月\(1\)日 经 ...

  2. NOI导刊总结

    NOI导刊总结 前两天去郑州,参加了什么NOI导刊的培训,然后就发现大佬是真的多,还十分意外的发现了一个事,清华北大是不是发笔记本和耳机,为啥三个老师的都一模一样... 这几天主要以讲.NOIP知识点 ...

  3. P1776 宝物筛选_NOI导刊2010提高(02)&& 多重背包二进制优化

    多重背包, 要求 \(N\log N\) 复杂度 Solution 众所周和, \(1-N\) 之内的任何数可以由 \(2^{0}, 2^{1}, 2^{2} ... 2^{\log N}, N - ...

  4. P1774 最接近神的人_NOI导刊2010提高(02)

    P1774 最接近神的人_NOI导刊2010提高(02) 关于此题为什么可以使用求逆序对的方法来做 假设一个数\(a_i\),且前\(i-1\)个数已经成为单调增的数列. 我们要从前\(a_1\)至\ ...

  5. 洛谷——P1966 火柴排队&&P1774 最接近神的人_NOI导刊2010提高(02)

    P1966 火柴排队 这题贪心显然,即将两序列中第k大的数的位置保持一致,证明略: 树状数组求逆序对啦 浅谈树状数组求逆序对及离散化的几种方式及应用 方法:从前向后每次将数插入到bit(树状数组)中, ...

  6. 洛谷P1774 最接近神的人_NOI导刊2010提高(02) [2017年6月计划 线段树03]

    P1774 最接近神的人_NOI导刊2010提高(02) 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门 ...

  7. [NOI导刊2010提高&洛谷P1774]最接近神的人 题解(树状数组求逆序对)

    [NOI导刊2010提高&洛谷P1774]最接近神的人 Description 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某 ...

  8. 洛谷—— P1775 古代人的难题_NOI导刊2010提高(02)

    P1775 古代人的难题_NOI导刊2010提高(02) 题目描述 门打开了,里面果然是个很大的厅堂.但可惜厅堂内除了中央的一张羊皮纸和一支精致的石笔,周围几具骷髅外什么也没有.难道这就是王室的遗产? ...

  9. 洛谷P1776 宝物筛选_NOI导刊2010提高(02)

    P1776 宝物筛选_NOI导刊2010提高(02) 题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了, ...

随机推荐

  1. C++ 与 Visual Studio 2019 和 WSL(二)

    终端 A more integrated terminal experience | Visual Studio Blog (microsoft.com) Say hello to the new V ...

  2. 网络通信IO的演变过程(二)(一个门外汉的理解)

    2.NIO 当与别人谈论NIO时,一定要弄清楚别人说的NIO是指哪个含义? NIO有2种含义: 1.NonBlocking IO,基于操作系统谈 2.Java New IO,基于Java谈 我们这里主 ...

  3. logging模块二

    背景,在学习logging时总是遇到无法理解的问题,总结,尝试一下更清晰明了了,让我们开始吧! logging模块常用format格式说明 %(levelno)s: 打印日志级别的数值 %(level ...

  4. 第七次Alpha Scrum Meeting

    本次会议为Alpha阶段第六次Scrum Meeting会议 会议概要 会议时间:2021年5月4日 会议地点:线上会议 会议时长:20min 会议内容简介:本次会议主要由每个人展示自己目前完成的工作 ...

  5. linux与windows下文件编码问题

    注:转换操作均在Linux终端进行操作 DOS与Unix格式转换 安装工具:dos2unix.unix2dos # ubuntu apt-get install dos2unix apt-get in ...

  6. js基础学习之"=="与"==="的区别

    var a = 1; var b = 1; var c = "1"; 1. "==" 可理解为相等运算符.相等运算符比较时,会自己进行类型转换,等于什么类型就会 ...

  7. Github点赞超多的Spring Boot学习教程+实战项目推荐!

    Github点赞接近 100k 的Spring Boot学习教程+实战项目推荐!   很明显的一个现象,除了一些老项目,现在 Java 后端项目基本都是基于 Spring Boot 进行开发,毕竟它这 ...

  8. Linux 安装nacos

    1.已有mysql环境 2.解压文件 #tar -zxvf package/nacos-server-2.0.1.tar.gz 3.创建数据库nacos_config(confnacos-mysql. ...

  9. FastJson 解析、序列化及反序列化

    一.环境准备:使用maven特性在pom.xml中导入fastjson的依赖包 <!-- https://mvnrepository.com/artifact/com.alibaba/fastj ...

  10. Spark中的两种模式

    两种模式 client-了解 cluster模式-开发使用 操作 1.需要Yarn集群 2.历史服务器 3.提交任务的的客户端工具-spark-submit命令 4.待提交的spark任务/程序的字节 ...