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.

输入输出样例

输入样例#1:

4 4 2 3 8
8
5
6
10
2 1 2
2 4 1
1 3 4
3 4 3

输出样例#1:

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)相关推荐

  1. [洛谷P1951]收费站_NOI导刊2009提高(2)

    题目大意:有一张$n$个点$m$条边的图,每个点有一个权值$w_i$,有边权,询问从$S$到$T$的路径中,边权和小于$s$,且$\max\limits_{路径经过k}\{w_i\}$最小,输出这个最 ...

  2. P1950 长方形_NOI导刊2009提高(2)[单调栈][贡献法]

    P1950 长方形_NOI导刊2009提高(2) 题意:给你\(n\times m\)的矩形,求没有*的子矩形数量.\(1\leq n,m\leq 1000\). 数据比较弱的题目是luoguP119 ...

  3. 洛谷 P1767 家族_NOI导刊2010普及(10)

    P1767 家族_NOI导刊2010普及(10) 题目描述 在一个与世隔绝的岛屿上,有一个有趣的现象:同一个家族的人家总是相邻的(这里的相邻是指东南西北四个方向),不同的家族之间总会有河流或是山丘隔绝 ...

  4. 洛谷P1807 最长路_NOI导刊2010提高(07) 求有向无环图的 最长路 图论

    洛谷P1807 最长路_NOI导刊2010提高(07) 图论 求有向无环图的 最长路 首先阐明一点 最长路dijkstra 是不能做 (当然我是不会做的,不过我貌似看到过网上的dalao有用dijst ...

  5. 洛谷 P1795 无穷的序列_NOI导刊2010提高(05)

    P1795 无穷的序列_NOI导刊2010提高(05) 题目描述 有一个无穷序列如下: 110100100010000100000- 请你找出这个无穷序列中指定位置上的数字 输入输出格式 输入格式: ...

  6. 洛谷 P1796 汤姆斯的天堂梦_NOI导刊2010提高(05)

    P1796 汤姆斯的天堂梦_NOI导刊2010提高(05) 题目描述 汤姆斯生活在一个等级为0的星球上.那里的环境极其恶劣,每天12小时的工作和成堆的垃圾让人忍无可忍.他向往着等级为N的星球上天堂般的 ...

  7. 洛谷——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,求一组满 ...

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

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

  9. P1801 黑匣子_NOI导刊2010提高(06)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

最新文章

  1. Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo
  2. 【 C 】回调函数简记
  3. 左神算法:复制含有随机指针节点的链表 / 复杂链表的复制(Java版本)
  4. java导出excel文件名_怎么解决java导出excel时文件名乱码
  5. mac 黑窗口连接mysql_mac上终端起动MySQL的方法
  6. 使用Anaconda3安装pytorch、paddle环境并在pycharm里面进行环境测试
  7. C/C++学习----第二章 继承和派生
  8. FCFS,SJF,HRRN调度算法
  9. Liist Object ? 获取方式
  10. 对理想团队模式的构想以及对软件流程的理解
  11. vue源码学习:Object.defineProperty 对数组监听
  12. 视频监控系统运维解决方案
  13. 如何使用ArcGIS Pro制作三维地图
  14. 关于 Mac 激活锁
  15. ai人工智能使用的软件_MachineRay:使用AI创造抽象艺术
  16. 关于《训练指南》中的“翻棋子游戏”
  17. 结对作业 ——UI组第八组 冯富禹 齐天浩
  18. 文本情感倾向分析——机器学习模型
  19. 女人健身操必知的健康常识
  20. 拉拉米抢单发单源码 二开ui 带视频介绍 放量功能

热门文章

  1. python使用符号 标示注释-第一章:Python语言程序设计
  2. python初学者代码-Python-为什么Python是初学者的完美选择?
  3. python大神-Python 大神 kennethreitz 又搞事了
  4. python画直方图成绩分析-Python数据分析:直方图及子图的绘制
  5. python php linux-linux怎么运行python?
  6. python为什么中文要encoding-python中encoding是什么意思
  7. python可以自学吗-python自学行吗 新手可以自学python吗
  8. python表白程序-程序员python表白代码
  9. python菜鸟工具-Python3 教程
  10. python常用命令汇总-python中pip工具常用命令汇总