题目链接

http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=1989

题目

Description

A国一共有N座城市,由M条双向公路连接。小X现在位于S市,他正在赶往T市。小X的时间有限,他还剩下L的时间。另外,到达每座城市,小X都需要缴纳一定的过路费,包括S市和T市。在缴纳过路费时,单次的花费越多,小X越不开心。他希望能够在规定时间内到达T市的同时,使缴纳过路费最多的那次最少。

Input

输入包含不超过10组数据。

对于每组数据,第一行5个正整数,N,M,S,T,L(N≤10000;M≤50000;S≤N;T≤N;L≤1000000000),意义如上文所述。接下来的1行有N个正整数,第i个数表示经过城市i需要缴纳的过路费Fi(Fi≤1000000000)。接下来M行,每行3个正整数Ui,Vi,Wi,(Ui≤N;Vi≤N;Wi≤1000000000)描述一条公路,表示从城市Ui到城市Vi需要花费Wi的时间。

Output

对于每组数据,输出一行一个正整数,表示小X交费最多的那次的最小值。如果小X无论如何也无法在规定时间内到达城市T,输出-1。

Sample Input

4 4 1 4 10
3 6 9 3
1 3 1
2 1 3
3 4 5
4 2 7
4 4 1 4 4
3 6 9 3
1 3 1
2 1 3
3 4 5
4 2 7
5 5 1 4 6
3 6 9 3 6
1 3 1
2 1 3
3 4 5
4 5 1
5 2 2

Sample Output

6
-1
6

题解

过路费最多的那次最少,很容易想到二分答案,然后检查,检查就跑一边dijkstra,在跑的时候加入条件边权必须小于mid,最后判断一下d[t]是否大于L,大于的话就l = mid + 1,否则r = mid - 1,记录一下ans即可

AC代码

#include<bits/stdc++.h>
#define ll long long
#define maxn 100050
#define pi pair<int, int>
using namespace std;
inline ll getnum() {
ll ans = 0; char c; ll flag = 1;
while (!isdigit(c = getchar()) && c != '-');
if (c == '-') flag = -1; else ans = c - '0';
while (isdigit(c = getchar())) ans = ans * 10 + c - '0';
return ans * flag;
}
struct node {
ll v, w;
node(ll vv, ll ww) {
v = vv;
w = ww;
}
};
vector<node> G[maxn];
void adde(ll a, ll b, ll w) {
G[a].push_back(node(b, w));
G[b].push_back(node(a, w));
}
ll n, m, s, t, l;
ll w[maxn];
ll dp[maxn];
ll maxw;
ll d[maxn], vis[maxn];
int dijkstra(int mid, int s) {
priority_queue<pi, vector<pi>, greater<pi> > q;
fill(d + 1, d + n + 1, 0x7fffffffffffffff);
d[s] = 0;
fill(vis + 1, vis + n + 1, false);
q.push(make_pair(d[s], s));
while (!q.empty()) {
pi now = q.top(); q.pop();
int x = now.second;
if (vis[x]) continue;
vis[x] = true;
if (w[x] > mid) continue;
for (int i = 0; i < G[x].size(); i++) {
int v = G[x][i].v, wi = G[x][i].w;
if (d[v] > d[x] + wi && w[v] <= mid && d[x] + wi <= l) {
d[v] = d[x] + wi;
q.push(make_pair(d[v], v));
}
}
}
if (d[t] > l) return 0;
else return 1;
}
int main() {
while (scanf("%lld%lld%lld%lld%lld", &n, &m, &s, &t, &l) != EOF) {
maxw = 0;
for (int i = 1; i <= n; i++) {
w[i] = getnum();
maxw = max(maxw, w[i]);
}
for (int i = 1; i <= n; i++) {
G[i].clear();
}
for (int i = 1; i <= m; i++) {
ll a, b; ll wi;
a = getnum(), b = getnum(), wi = getnum();
adde(a, b, wi);
}
ll li = 0, r = maxw + 100, mid = -1;
ll ans = 0x7fffffffffffffff;
while (li <= r) {
mid = (li + r) >> 1;
if (dijkstra(mid, s)) {
r = mid - 1;
ans = min(ans, mid);
}
else li = mid + 1;
}
if (li > maxw) cout << "-1" << endl;
else cout << ans << endl;
}
return 0;
}
/**********************************************************************
Problem: 1989
User: Artoriax
Language: C++
Result: AC
Time:328 ms
Memory:10664 kb
**********************************************************************/

CSU-1989 赶路的小X的更多相关文章

  1. CSU 1777: 大还是小?【模拟/后导0】

    293419 roniking 1777 Accepted 2032 0 C++ 2000 2018-04-03 19:21:25 Description 输入两个实数,判断第一个数大,第二个数大还是 ...

  2. csu 1982:小M的移动硬盘(双向链表)

    Description 最近小M买了一个移动硬盘来储存自己电脑里不常用的文件.但是他把这些文件一股脑丢进移动硬盘后,觉得这些文件似乎没有被很好地归类,这样以后找起来岂不是会非常麻烦? 小M最终决定要把 ...

  3. csu 1976: 搬运工小明

    1976: 搬运工小明 Submit Page   Summary   Time Limit: 2 Sec     Memory Limit: 128 Mb     Submitted: 94     ...

  4. CSU 1802 小X的战斗力【拓扑dp】

    题目链接 题意:n个人,每个人有一个能力值.给出m组关系A, B, 表示A的能力值大于B的能力值. 问:m组关系中是否有自相矛盾的?若不矛盾,问:第1个人在所有人的能力值中排名第几?有多少人的能力值的 ...

  5. 微信小程序导航:官方工具+精品教程+DEMO集合(1月7更新)

    1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=14764346784612:简易教程:https://mp.weixin.qq.com/debug ...

  6. csu oj 1811: Tree Intersection (启发式合并)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1811 给你一棵树,每个节点有一个颜色.问删除一条边形成两棵子树,两棵子树有多少种颜色是有 ...

  7. csu 1312 榜单(模拟题)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1312 1312: 榜单 Time Limit: 1 Sec  Memory Limit: 128 ...

  8. poj 2528 线段树 离散化的小技巧

    题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报思路:直接搞超时+超内存,需要离散化.离散化简单的来说就是只取我们需要的值来 用,比如说区间[1000,2000],[1990,2012] ...

  9. csu 10月 月赛 A 题

    Welcome to CSU OnlineJudge Problem A: Small change Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 15 ...

随机推荐

  1. Breaking Biscuits(模板题-求凸边形的宽)

    Breaking Biscuits 时间限制: 1 Sec  内存限制: 128 MB  Special Judge提交: 70  解决: 26[提交] [状态] [讨论版] [命题人:admin] ...

  2. 旋度定理(Curl Theorem)和散度定理(Divergence theorem)

    原文链接 首先说说格林公式(Green's theorem).对于一段封闭曲线,若其围城的区域D为单连通区域(内部任意曲线围城的区域都属于院区域),则有如下公式: 其中其中L为D的边界,取正方向.如果 ...

  3. 第14章 启动文件详解—零死角玩转STM32-F429系列

    第14章     启动文件详解 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege ...

  4. JS中的执行环境和作用域

    window 是最大最外围的执行环境,然后每个函数都有自己的执行环境.JS代码是从上到下执行的,单纯的用语言描述可能会有点绕,而且不大直观.我们看着代码来 console.log('global be ...

  5. 理解css中的position属性

    理解css中的position 两种类型的定位 static类型:只有一个值position: static.position默认值 relative类型:包括三个值,这三个值会相互影响,允许你以特定 ...

  6. java高并发之CountDownLatch,CyclicBarrier和join

    晚上打车回家,在车上看到一篇文章<22岁大学生获谷歌天价Offer,年薪千万!>,讲的是印度一个22岁大学生多次参加ACM大赛,开源多个项目,以非常牛逼的履历通过了谷歌的AI测试,斩获谷歌 ...

  7. spring cloud 学习之服务消费者(Feign)

    一.Feign简介 Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单.使用Feign,只需要创建一个接口并注解.它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注 ...

  8. linux系统ext文件系统知识

    ext2文件系统细节 我们都知道,操作系统中的数据分为文件内容和文件属性两部分,其中文件内容就是文件的实体数据,而文件属性就是文件类型.权限.属主.修改时间等信息.操作系统会将上述文件的内容放入磁盘文 ...

  9. Tomcat+jdk 环境处理 java jsp代码编写web环境的容器

    Tomcat是由 Apache 软件基金会下属的 Jakarta 项目开发的一个Servlet 容器,按照 SunMicrosystems 提供的技术规范,实现了对 Servlet 和 JavaSer ...

  10. 数据分析处理库Pandas——groupby

    DataFrame结构 指定列中相同元素求和 备注:指定列"key"中相同元素的"data"值求和. 备注:指定列"A"和"B&q ...