题目描述

在某个遥远的国家里,有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,可能有两条边连接着相同的城市。

二分+最短路

屠龙宝刀点击就送

#include <algorithm>
#include <cstdio>
#include <cctype>
#include <queue>
#define N 500005
using namespace std;
typedef long long LL;
inline void read(LL &x)
{
bool f=;register char ch=getchar();
for(x=;!isdigit(ch);ch=getchar()) if(ch=='-') f=;
for(;isdigit(ch);x=x*+ch-'',ch=getchar());
x=f?-x:x;
}
bool vis[N];
LL s,f[N],k[N],val[N<<],far[N];
int n,m,u,v,cnt,to[N<<],head[N],nextt[N<<];
struct node
{
int x,y;
bool operator<(node a)const
{
return y>a.y;
}
};
priority_queue<node>q;
bool check(LL x)
{
if(f[u]>x||f[v]>x) return false;
for(int i=;i<=n;++i) far[i]=1e15,vis[i]=false;
far[u]=;
q.push((node){u,far[u]});
for(node now;!q.empty();)
{
now=q.top();
q.pop();
if(vis[now.x]) continue;
vis[now.x]=true;
for(int i=head[now.x];i;i=nextt[i])
{
int v=to[i];
if(f[v]>x) continue;
if(far[v]>far[now.x]+val[i])
{
far[v]=far[now.x]+val[i];
if(!vis[v]) q.push((node){v,far[v]});
}
}
}
return far[v]<=s;
}
int main(int argc,char *argv[])
{
scanf("%d%d%d%d",&n,&m,&u,&v);
read(s);
for(int i=;i<=n;++i) read(f[i]),k[i]=f[i];
sort(k+,k++n);
LL c,ans=-;
int l=,r=n;
for(int a,b;m--;)
{
scanf("%d%d",&a,&b);
read(c);
nextt[++cnt]=head[a];to[cnt]=b;val[cnt]=c;head[a]=cnt;
nextt[++cnt]=head[b];to[cnt]=a;val[cnt]=c;head[b]=cnt;
}
for(int mid;l<=r;)
{
mid=(l+r)>>;
if(check(k[mid])) ans=k[mid],r=mid-;
else l=mid+;
}
printf("%lld\n",ans);
return ;
}

洛谷 P1951 收费站_NOI导刊2009提高(2)的更多相关文章

  1. 洛谷 P1951 收费站_NOI导刊2009提高(2) 最短路+二分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 思路 AC代码 总结 题面 题目链接 P1951 收费站_NOI导刊2009提高(2) 其 ...

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

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

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

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

  4. 洛谷 P1950 长方形_NOI导刊2009提高(2)

    传送门 思路 首先定义\(h\)数组,\(h[i][j]\)表示第\(i\)行第\(j\)列最多可以向上延伸多长(直到一个被用过的格子) 然后使用单调栈算出 \(l_i\)和 \(r_i\) ,分别是 ...

  5. 洛谷 P1950 长方形_NOI导刊2009提高(2) 题解

    P1950 长方形_NOI导刊2009提高(2) 题目描述 小明今天突发奇想,想从一张用过的纸中剪出一个长方形. 为了简化问题,小明做出如下规定: (1)这张纸的长宽分别为n,m.小明讲这张纸看成是由 ...

  6. luogu P1951 收费站_NOI导刊2009提高(2) |二分答案+最短路

    题目描述 在某个遥远的国家里,有n个城市.编号为1,2,3,-,n. 这个国家的政府修建了m条双向的公路.每条公路连接着两个城市.沿着某条公路,开车从一个城市到另一个城市,需要花费一定的汽油. 开车每 ...

  7. Luogu P1951 收费站_NOI导刊2009提高(2)

    二分答案+堆优Dijkstra 这个题有些巧妙. 首先,因为要在油量耗完之前跑到终点,所以我们可以用最短路.只要从\(s\)出发到\(t\),它的最短距离大于油量,我们就可以断定它一定走不通,直接输出 ...

  8. Luogu P1951 收费站_NOI导刊2009提高(2) 二分 最短路

    思路:二分+最短路 提交:1次 题解: 二分最后的答案. $ck()$: 对于每次的答案$md$跑$s,t$的最短路,但是不让$c[u]>md$的点去松弛别的边,即保证最短路不经过这个点.最后$ ...

  9. 题解 P1951 【收费站_NOI导刊2009提高(2)】

    查看原题请戳这里 核心思路 题目让求最大费用的最小值,很显然这道题可以二分,于是我们可以二分花费的最大值. check函数 那么,我们该怎么写check函数呢? 我们可以删去费用大于mid的点以及与其 ...

随机推荐

  1. VSS配置

    http://www.cnblogs.com/FreeDong/articles/2193151.html

  2. Unity3d 脚本使用规则

    脚本是Unity游戏开发的重要组成部分,通过脚本可以监听游戏中的相关事件和响应玩家的输入,并在游戏中安排事件发生.另外,脚本还可用于创建图形效果,控制对象的物理行为等.在Unity中使用脚本是需要注意 ...

  3. IOS Swift UITableViewcontroller实现点击空白处隐藏键盘

    在ios开发中,为了方便,我们经常使用UITableViewcontroller,比如搜索界面为了方便可能更多的使用UITableViewcontroller,那么问题就来了,当我点击搜索框的时候会弹 ...

  4. IOS BLE4.0蓝牙和外设连接和收发数据的流程

    前言: 苹果在IOS 6系统之后开始支持BLE 4.0,iPhone4s,iPod 5,iPad 3等之后的机型开始内嵌BLE4.0硬件,因此在开发前请先确认你的开发环境符合上述要求,并且苹果在BLE ...

  5. Java基础笔记(十四)——封装

    封装(好比ATM机) 将类的某些信息隐藏在类内部,不允许外部程序直接访问(隐藏对象的信息),通过该类提供的方法来实现对隐藏信息的操作和访问(留出访问的接口). 特点: 1.只能通过规定的方法访问数据. ...

  6. js unicode

    参考 http://www.ruanyifeng.com/blog/2014/12/unicode.html

  7. Migration-添加表

    public partial class _111111 : DbMigration { public override void Up() { CreateTable( "dbo.Asse ...

  8. P4135 作诗

    传送门 分块 设sum[ i ] [ j ] 存从左边到第 i 块时,数字 j 的出现次数 f [ i ] [ j ] 存从第 i 块,到第 j 块的一整段的答案 那么最后答案就是一段区间中几块整段的 ...

  9. python3.6下安装wingIDE破解方法

    1.wingIDE的下载: 在电脑配置好的python环境情况下,去官网下载wingIDE6,按照一般方式安装好.安装好它会自动提示你是否激活,你点击激活.然后到下一步. 2.脚本的制作: impor ...

  10. POJ 1061青蛙的约会。求解(x+mT)%L=(y+nT)%L的最小步数T。

    因为是同余,所以就是(x+mT)%L-(y+nT)%L=0.可以写成(x-y+(m-n)T)%L=0.就是这个数是L的倍数啦.那么我可以这样x-y+(m-n)T + Ls = 0.就可以了,s可正可负 ...