Description

   在某个遥远的国家里,有n个城市。编号为1,2,3,……,n。 这个国家的政府修建了m条双向的公路。每条公路连接着两个城市。沿着某条公路,开车从一个城市到另一个城市,需要花费一定的汽油。开车每经过一个城市,都会被收取一定的费用(包括起点和终点城市)。所有的收费站都在城市中,在城市间的公路上没有任何的收费站。小红现在要开车从城市u到城市v(1<=u,v<=n)。她的车最多可以装下s升的汽油。在出发的时候,车的油箱是满的,并且她在路上不想加油。在路上,每经过一个城市,她要交一定的费用。如果她某次交的费用比较多,她的心情就会变得很糟。所以她想知道,在她能到达目的地的前提下,她交的费用中最多的一次最少是多少。这个问题对于她来说太难了,于是她找到了聪明的你,你能帮帮她吗?

Input

  第一行5个正整数,n,m,u,v,s。分别表示有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

Data Constraint

数据规模 对于60%的数据,满足n<=200,m<=19900,s<=200,没有一条边连接着两个相同的城市。
对于100%的数据,满足n<=10000,m<=50000,s<=1000000000,可能有两条边连接着相同的城市。
对于100%的数据,满足ci<=1000000000,fi<=1000000000

Solution

  • 这题又是套路——双条件问题,果断转换成 二分+判断性问题

  • 考虑二分答案,即得到一个城市花费的上限

  • 之后,以起点进行一次 SPFA ,中途不能遍历超过上限的点

  • 最后看终点是否能被遍历到,再修改二分上下界即可!

  • 然而心机出题人的数据竟然能卡掉强悍的 SPFA,时间略微上溢

  • 于是考虑使用堆维护 SPFA 中的节点,使其远者优先,提高效率

  • 注: 为了方便,以下标程中使用 C++ 优先队列并重载运算符。

Code

#include<cstdio>
#include<queue>
using namespace std;
const int N=10001;
struct data
{int node,pay;
}que[N];
int tot,n,m,u,v,s;
long long sum,dis[N];
int f[N];
int first[N],next[N*10],en[N*10],w[N*10];
bool bz[N];
inline int read()
{int data=0; char ch=0;while(ch<'0' || ch>'9') ch=getchar();while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();return data;
}
inline void insert(int x,int y,int z)
{next[++tot]=first[x];first[x]=tot;en[tot]=y;w[tot]=z;
}
struct cmp
{bool operator()(int x,int y){return dis[x]>dis[y];}
};
inline bool spfa(int lim)
{if(f[u]>lim || f[v]>lim) return false;priority_queue <int,vector<int>,cmp> que;for(int i=1;i<=n;i++) dis[i]=sum;dis[u]=0;que.push(u);while(!que.empty()){int now=que.top();que.pop();bz[now]=false;for(int i=first[now];i;i=next[i]){if(f[en[i]]>lim) continue;if(dis[now]+w[i]<dis[en[i]]){dis[en[i]]=dis[now]+w[i];if(!bz[en[i]]){bz[en[i]]=true;que.push(en[i]);}}}}return dis[v]<=s;
}
int main()
{n=read(),m=read(),u=read(),v=read(),s=read();int l=1e9,r=0;for(int i=1;i<=n;i++){f[i]=read();if(f[i]>r) r=f[i]; elseif(f[i]<l) l=f[i];}for(int i=1;i<=m;i++){int x=read(),y=read(),z=read();if(x==y) continue;sum+=z;insert(x,y,z);insert(y,x,z);}int ans=-1;while(l<=r){int mid=(l+r)>>1;if(spfa(mid)){ans=mid;r=mid-1; }else l=mid+1;}printf("%d",ans);return 0;
}

JZOJ 1251. 收费站相关推荐

  1. JZOJ 5461 购物 —— 贪心

    题目:https://jzoj.net/senior/#main/show/5461 贪心,原来想了个思路,优先选优惠价最小的 K 个,然后其他按原价排序遍历: 如果当前物品没选过,原价选上,如果选过 ...

  2. POJ 1251 Jungle Roads

    题意:给你n个点  n-1行每行代表的是这个点到给定点的距离   求最短路 解题思路:开始是用getchar  发现runtime error   后来用了  字符串  才改进了   裸Kruskal ...

  3. hdu 1251+hdu 1671(字典树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251 一开始我是直接用STL做的,唉...没有经验那...orz...然后毫无疑问地超时了... 看别 ...

  4. 洛谷——P1951 收费站_NOI导刊2009提高(2)

    https://www.luogu.org/problem/show?pid=1951 题目描述 在某个遥远的国家里,有n个城市.编号为1,2,3,-,n. 这个国家的政府修建了m条双向的公路.每条公 ...

  5. BZOJ 1251: 序列终结者( splay )

    先orz一下clj...我的splay跟着他写的... 这道题很普通的splay我调了这么久 T T , 就是因为 null 的值初始化为0 , 结果就挂了... ------------------ ...

  6. T^TOJ - 1251 - 。◕‿◕。TMD - 欧拉函数 - 质因数分解

    http://www.fjutacm.com/Problem.jsp?pid=1251 想了很久,一开始居然还直接枚举因子d,计算重复了. 首先你要找与n的最大公因子大于m的x的个数. \[\sum\ ...

  7. Navicat 远程连接docker容器中的mysql 报错1251 - Client does not support authentication protocol 解决办法

    Navicat 远程连接docker容器中的mysql 报错1251 - Client does not support authentication protocol 解决办法 1).容器中登录my ...

  8. JZOJ 5372. 【NOIP2017提高A组模拟9.17】猫

    Description 信息组最近猫成灾了!隔壁物理组也拿猫没办法.信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数),编号为1 到n,站成了一个环,第i 只猫的左边是第i ...

  9. hdu 1251 统计难题(字典树)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1251 分析: 关于字典树的题目似乎都有一个普通适用性的模板,有时只是稍加改动来满足临时的要求,我的一 ...

最新文章

  1. js php base64,JavaScript实现Base64编码与解码的代码详解
  2. 手机群发短信脚本python
  3. 8583报文解析实例介绍
  4. 电脑硬盘是干什么用的_电脑硬盘位不够用?有了它就不担心、奥睿科硬盘柜体验...
  5. 初探 Vue 生命周期和钩子函数
  6. EasyUI中Datagride数据网格的简单使用
  7. OCulus Rift 游戏开发六原则
  8. Boost::context模块callcc的jump_void测试程序
  9. Android之实现多张图片点击预览(支持放缩)和滑动
  10. 【Flink】Flink自带的测试类 AbstractStreamOperatorTestHarness
  11. redis 辅助工具包 - redis-aux
  12. php UTF8 转字节数组,后使用 MD5 计算摘要
  13. python爬虫——打造个人专属pubmed文献搜索工具
  14. oracle bpm 教学视频,Oracle BPM 官方文件摘录
  15. 新手入门makefile教程
  16. Description: 80010105 / 服务器出现意外情况。【亲测可用】
  17. Markdown 数学符号大全
  18. ROS2 中的 launch 文件入门的 6 个疑问
  19. iosepub阅读器_epub格式电子书阅读器 iOS版
  20. python在windows与linux下读取doc文件

热门文章

  1. Android自定义控件(特效二) 点击屏幕,根据所点击的位置绘制桃心
  2. Linux 配置iso系统盘为本地yum源
  3. 基于FPGA的AM信号调制与解调详细步骤
  4. 断言(assert)详解
  5. [云炬创业管理笔记]第二章测试6
  6. 科大星云诗社动态20201206
  7. 小米wifi每天晚上准时断网_小米路由器遭恶意抹黑 官方回应:抵制这种下三滥...
  8. 简单的串口助手程序开发
  9. C++中的NULL与DELPHI中的nil作用相同
  10. opencv-从设备获取视频并且一帧一帧的保存下来