洛谷P1951 BSOJ2636 CODEVS4175 收费站
2016-11-08 15:38
351 查看
2636 -- 【模拟试题】收费站
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
4 4 2 3 8
8
5
6
10
2 1 2
2 4 1
1 3 4
3 4 3
Sample Output
8
Hint
【输入样例2】
4 4 2 3 3
8
5
6
10
2 1 2
2 4 1
1 3 4
3 4 3
【输出样例2】
-1
【数据规模】
对于60%的数据,满足n<=200,m<=10000,s<=200
对于100%的数据,满足n<=10000,m<=50000,s<=1000000000
对于100%的数据,满足ci<=1000000000,fi<=1000000000,可能有两条边连接着相同的城市。
由最大值最小可以想到二分,二分最大收费看最短路是否小于s,模板题。
但是,这道题要卡SPFA,注意!!!!
加一个SLF优化即可
最短路总结与拓展,内含SLF优化以及其他一些小技巧
二分题目总结在此
代码如下:
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
4 4 2 3 8
8
5
6
10
2 1 2
2 4 1
1 3 4
3 4 3
Sample Output
8
Hint
【输入样例2】
4 4 2 3 3
8
5
6
10
2 1 2
2 4 1
1 3 4
3 4 3
【输出样例2】
-1
【数据规模】
对于60%的数据,满足n<=200,m<=10000,s<=200
对于100%的数据,满足n<=10000,m<=50000,s<=1000000000
对于100%的数据,满足ci<=1000000000,fi<=1000000000,可能有两条边连接着相同的城市。
由最大值最小可以想到二分,二分最大收费看最短路是否小于s,模板题。
但是,这道题要卡SPFA,注意!!!!
加一个SLF优化即可
最短路总结与拓展,内含SLF优化以及其他一些小技巧
二分题目总结在此
代码如下:
#include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<cstdio> #include<queue> using namespace std; struct node{long long to,nxt,val; }w[100005]; long long vis[10005],u,s,d[10005]; deque<long long>q; long long cnt=0,h[10005],f[10005],v,n,m,a,b,c; void add(long long x,long long y,long long z) { cnt++;w[cnt].to=y;w[cnt].nxt=h[x];w[cnt].val=z;h[x]=cnt; } long long check(long long x) { if(f[u]>x||f[v]>x)return 0; memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) d[i]=1e18; vis[u]=1;d[u]=0; q.push_back(u); while(!q.empty()) { long long fr=q.front(); vis[fr]=0;q.pop_front(); for(long long i=h[fr];i;i=w[i].nxt) { long long j=w[i].to; if(f[j]>x)continue; if(d[j]>d[fr]+w[i].val) { d[j]=d[fr]+w[i].val; if(!vis[j]) { if(q.empty())q.push_back(j); else { if(d[j]<d[q.front()])q.push_front(j); else q.push_back(j); } vis[j]=1; } } } } if(d[v]<=s)return 1; return 0; } int main(){ long long l=1,r; cin>>n>>m>>u>>v>>s; for(long long i=1;i<=n;i++) { cin>>f[i]; r=max(r,f[i]); } for(long long i=1;i<=m;i++) { cin>>a>>b>>c; add(a,b,c); add(b,a,c); } if(!check(1e19)) { cout<<-1; return 0; } while(l<=r) { long long mid=(l+r)>>1; if(check(mid))r=mid-1; else l=mid+1; } cout<<l; return 0; }
相关文章推荐
- Cpp环境【Code[VS]4175】【CQYZOJ1824】收费站
- codevs 4175 收费站(二分+SPFA)
- [codevs4175]收费站
- codevs 4175 收费站(二分+spfa)
- codevs 4175 收费站
- BSOJ:2636 收费站--二分+SPFA(SLF优化)
- codevs 3022 西天收费站 x
- BSOJ1054 洛谷P1054 CODEVS1107【NOIP 2005提高】等价表达式 随机化
- CODEVS1815 BSOJ2971 生日礼物 DP 或 随机化
- 【日常学习】【区间DP】codevs1048 石子归并题解
- codevs 1391 伊吹萃香
- codevs 2460 [ZJOI] 树的统计 树剖
- 使用vs2013编译时遇到error msb3073 vcend exited with code 1
- CODEVS 1073家族
- codevs 1028 花店橱窗布置
- 银河英雄传说(codevs 1540)
- Codevs1022:覆盖
- 【基础练习】【背包DP】codevs1068 乌龟棋题解
- codevs 1643 线段覆盖 3(贪心+快排)
- vscode php 添加代码跳转功能