洛谷——P1951 收费站_NOI导刊2009提高(2)
https://www.luogu.org/problem/show?pid=1951
题目描述
在某个遥远的国家里,有n个城市。编号为1,2,3,…,n。
这个国家的政府修建了m条双向的公路。每条公路连接着两个城市。沿着某条公路,开车从一个城市到另一个城市,需要花费一定的汽油。
开车每经过一个城市,都会被收取一定的费用(包括起点和终点城市)。所有的收费站都在城市中,在城市间的公路上没有任何的收费站。
小红现在要开车从城市u到城市v(1<=u,v<=n)。她的车最多可以装下s升的汽油。在出发的时候,车的油箱是满的,并且她在路上不想加油。
在路上,每经过一个城市,她都要交一定的费用。如果某次交的费用比较多,她的心情就会变得很糟。所以她想知道,在她能到达目的地的前提下,她交的费用中最多的一次最少是多少。这个问题对于她来说太难了,于是她找到了聪明的你,你能帮帮她吗?
输入输出格式
输入格式:
第一行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升的汽油。
输出格式:
仅一个整数,表示小红交费最多的一次的最小值。
如果她无法到达城市v,输出-1.
输入输出样例
4 4 2 3 8 8 5 6 10 2 1 2 2 4 1 1 3 4 3 4 3
8
说明
【数据规模】
对于60%的数据,满足n<=200,m<=10000,s<=200
对于100%的数据,满足n<=10000,m<=50000,s<=1000000000
对于100%的数据,满足ci<=1000000000,fi<=1000000000,可能有两条边连接着相同的城市。
做法同http://www.cnblogs.com/Shy-key/p/7684142.html, 数据更强,换了堆优化的Dijkstra
1 #include <algorithm> 2 #include <cstdio> 3 #include <queue> 4 5 #define max(a,b) (a>b?a:b) 6 7 inline void read(int &x) 8 { 9 x=0; register char ch=getchar(); 10 for(; ch>'9'||ch<'0'; ) ch=getchar(); 11 for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0'; 12 } 13 14 const int INF(0x3f3f3f3f); 15 const int N(10626); 16 const int M(50626); 17 int n,m,s,t,b,f[N],a[N]; 18 int head[N],sumedge; 19 struct Edge { 20 int v,next,w; 21 Edge(int v=0,int next=0,int w=0):v(v),next(next),w(w){} 22 }edge[M<<1]; 23 inline void ins(int u,int v,int w) 24 { 25 edge[++sumedge]=Edge(v,head[u],w),head[u]=sumedge; 26 edge[++sumedge]=Edge(u,head[v],w),head[v]=sumedge; 27 } 28 29 struct Node { 30 int pos;long long dis; 31 Node() {pos=0,dis=0;} 32 bool operator < (const Node&x)const 33 { 34 return dis>x.dis; 35 } 36 }u,v; 37 38 bool vis[N]; 39 long long dis[N]; 40 std::priority_queue<Node>que; 41 42 int L,R,Mid,ans; 43 inline bool check(int s,int x) 44 { 45 if(f[s]>x) return 0; 46 for(int i=1; i<=n; ++i) dis[i]=1ll*INF,vis[i]=0; 47 for(; !que.empty(); ) que.pop(); 48 u.dis=dis[s]=0; u.pos=s; que.push(u); 49 for(; !que.empty(); ) 50 { 51 u=que.top(); que.pop(); 52 if(vis[u.pos]) continue; vis[u.pos]=1; 53 for(int i=head[u.pos]; i; i=edge[i].next) 54 { 55 v.pos=edge[i].v; 56 if(f[v.pos]>x) continue; 57 if(dis[v.pos]<=dis[u.pos]+1ll*edge[i].w) continue; 58 v.dis=dis[v.pos]=dis[u.pos]+1ll*edge[i].w; que.push(v); 59 } 60 } 61 return dis[t]<b; 62 } 63 64 int Presist() 65 { 66 read(n),read(m),read(s),read(t),read(b); 67 for(int i=1; i<=n; ++i) read(f[i]),a[i]=f[i]; 68 for(int u,v,w,i=1; i<=m; ++i) 69 read(u),read(v),read(w),ins(u,v,w); 70 std::sort(a+1,a+n+1); 71 for(L=0,R=n; L<=R; ) 72 { 73 Mid=L+R>>1; 74 if(check(s,a[Mid])) 75 { 76 ans=a[Mid]; 77 R=Mid-1; 78 } 79 else L=Mid+1; 80 } 81 if(!ans) puts("-1"); 82 else printf("%d\n",ans); 83 return 0; 84 } 85 86 int Aptal=Presist(); 87 int main(int argc,char**argv){;}
转载于:https://www.cnblogs.com/Shy-key/p/7689511.html
洛谷——P1951 收费站_NOI导刊2009提高(2)相关推荐
- [洛谷P1951]收费站_NOI导刊2009提高(2)
题目大意:有一张$n$个点$m$条边的图,每个点有一个权值$w_i$,有边权,询问从$S$到$T$的路径中,边权和小于$s$,且$\max\limits_{路径经过k}\{w_i\}$最小,输出这个最 ...
- P1950 长方形_NOI导刊2009提高(2)[单调栈][贡献法]
P1950 长方形_NOI导刊2009提高(2) 题意:给你\(n\times m\)的矩形,求没有*的子矩形数量.\(1\leq n,m\leq 1000\). 数据比较弱的题目是luoguP119 ...
- 洛谷 P1767 家族_NOI导刊2010普及(10)
P1767 家族_NOI导刊2010普及(10) 题目描述 在一个与世隔绝的岛屿上,有一个有趣的现象:同一个家族的人家总是相邻的(这里的相邻是指东南西北四个方向),不同的家族之间总会有河流或是山丘隔绝 ...
- 洛谷P1807 最长路_NOI导刊2010提高(07) 求有向无环图的 最长路 图论
洛谷P1807 最长路_NOI导刊2010提高(07) 图论 求有向无环图的 最长路 首先阐明一点 最长路dijkstra 是不能做 (当然我是不会做的,不过我貌似看到过网上的dalao有用dijst ...
- 洛谷 P1795 无穷的序列_NOI导刊2010提高(05)
P1795 无穷的序列_NOI导刊2010提高(05) 题目描述 有一个无穷序列如下: 110100100010000100000- 请你找出这个无穷序列中指定位置上的数字 输入输出格式 输入格式: ...
- 洛谷 P1796 汤姆斯的天堂梦_NOI导刊2010提高(05)
P1796 汤姆斯的天堂梦_NOI导刊2010提高(05) 题目描述 汤姆斯生活在一个等级为0的星球上.那里的环境极其恶劣,每天12小时的工作和成堆的垃圾让人忍无可忍.他向往着等级为N的星球上天堂般的 ...
- 洛谷——P1775 古代人的难题_NOI导刊2010提高(02) P1936 水晶灯火灵(斐波那契数列)...
P1775 古代人的难题_NOI导刊2010提高(02) P1936 水晶灯火灵 斐波那契数列 1.x,y∈[1-k],且x,y,k∈Z 2.(x^2-xy-y^2)^2=1 给你一个整数k,求一组满 ...
- 洛谷—— P1775 古代人的难题_NOI导刊2010提高(02)
P1775 古代人的难题_NOI导刊2010提高(02) 题目描述 门打开了,里面果然是个很大的厅堂.但可惜厅堂内除了中央的一张羊皮纸和一支精致的石笔,周围几具骷髅外什么也没有.难道这就是王室的遗产? ...
- P1801 黑匣子_NOI导刊2010提高(06)
P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...
最新文章
- Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo
- 【 C 】回调函数简记
- 左神算法:复制含有随机指针节点的链表 / 复杂链表的复制(Java版本)
- java导出excel文件名_怎么解决java导出excel时文件名乱码
- mac 黑窗口连接mysql_mac上终端起动MySQL的方法
- 使用Anaconda3安装pytorch、paddle环境并在pycharm里面进行环境测试
- C/C++学习----第二章 继承和派生
- FCFS,SJF,HRRN调度算法
- Liist Object ? 获取方式
- 对理想团队模式的构想以及对软件流程的理解
- vue源码学习:Object.defineProperty 对数组监听
- 视频监控系统运维解决方案
- 如何使用ArcGIS Pro制作三维地图
- 关于 Mac 激活锁
- ai人工智能使用的软件_MachineRay:使用AI创造抽象艺术
- 关于《训练指南》中的“翻棋子游戏”
- 结对作业 ——UI组第八组 冯富禹 齐天浩
- 文本情感倾向分析——机器学习模型
- 女人健身操必知的健康常识
- 拉拉米抢单发单源码 二开ui 带视频介绍 放量功能
热门文章
- python使用符号 标示注释-第一章:Python语言程序设计
- python初学者代码-Python-为什么Python是初学者的完美选择?
- python大神-Python 大神 kennethreitz 又搞事了
- python画直方图成绩分析-Python数据分析:直方图及子图的绘制
- python php linux-linux怎么运行python?
- python为什么中文要encoding-python中encoding是什么意思
- python可以自学吗-python自学行吗 新手可以自学python吗
- python表白程序-程序员python表白代码
- python菜鸟工具-Python3 教程
- python常用命令汇总-python中pip工具常用命令汇总