题目背景

在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量

有一天他醒来后发现自己居然到了联盟的主城暴风城

在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛

题目描述

在艾泽拉斯,有n个城市。编号为1,2,3,...,n。

城市之间有m条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联盟的攻击,进而损失一定的血量。

没经过一个城市,都会被收取一定的过路费(包括起点和终点)。路上并没有收费站。

假设1为暴风城,n为奥格瑞玛,而他的血量最多为b,出发时他的血量是满的。

歪嘴哦不希望花很多钱,他想知道,在可以到达奥格瑞玛的情况下,他所经过的所有城市中最多的一次收取的费用的最小值是多少。

输入输出格式

输入格式:

第一行3个正整数,n,m,b。分别表示有n个城市,m条公路,歪嘴哦的血量为b。

接下来有n行,每行1个正整数,fi。表示经过城市i,需要交费fi元。

再接下来有m行,每行3个正整数,ai,bi,ci(1<=ai,bi<=n)。表示城市ai和城市bi之间有一条公路,如果从城市ai到城市bi,或者从城市bi到城市ai,会损失ci的血量。

输出格式:

仅一个整数,表示歪嘴哦交费最多的一次的最小值。

如果他无法到达奥格瑞玛,输出AFK。

输入输出样例

输入样例#1:

4 4 8
8
5
6
10
2 1 2
2 4 1
1 3 4
3 4 3
输出样例#1:

10

说明

对于60%的数据,满足n≤200,m≤10000,b≤200

对于100%的数据,满足n≤10000,m≤50000,b≤1000000000

对于100%的数据,满足ci≤1000000000,fi≤1000000000,可能有两条边连接着相同的城市。


最大值最小化...............

把f离散化一下,二分最小费用

走小于mid的点最短路看d[n]是否<b

//
// main.cpp
// luogu1462
//
// Created by Candy on 11/11/2016.
// Copyright © 2016 Candy. All rights reserved.
// #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=1e4+,M=5e4+,INF=1e9+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,m,b,u,v,w,f[N],mp[N];
struct edge{
int v,w,ne;
}e[M<<];
int h[N],cnt=;
inline void ins(int u,int v,int w){
cnt++;
e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;
cnt++;
e[cnt].v=u;e[cnt].w=w;e[cnt].ne=h[v];h[v]=cnt;
}
int q[N],head=,tail=;
inline void lop(int &x){if(x==N) x=;}
int d[N],inq[N];
bool spfa(int lmt){
for(int i=;i<=n;i++) d[i]=INF;
d[]=;
head=tail=;
memset(inq,,sizeof(inq));
q[tail++]=; inq[]=;
while(head!=tail){
int u=q[head++];inq[u]=;lop(head);
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v,w=e[i].w;
if(f[v]>lmt) continue;
if(d[v]>d[u]+w){
d[v]=d[u]+w;
if(!inq[v]){q[tail++]=v;inq[v]=;lop(tail);}
}
}
}
if(d[n]<=b) return true;
return false;
}
int main(int argc, const char * argv[]) {
n=read();m=read();b=read();
for(int i=;i<=n;i++) mp[i]=f[i]=read();
for(int i=;i<=m;i++){
u=read();v=read();w=read();if(u!=v) ins(u,v,w);
}
sort(mp+,mp++n);
int l=,r=n,ans=n+;
while(l<=r){
int mid=(l+r)>>;//printf("erfen %d %d %d\n",l,r,mid);
if(spfa(mp[mid])) ans=min(ans,mid),r=mid-;
else l=mid+;
}
if(ans==n+) puts("AFK");
else printf("%d",mp[ans]);
return ;
}

最新文章

  1. NOIP2012同余方程[exgcd]
  2. mybatiGenerator
  3. 内存管理_深入剖析volatile关键字
  4. 【IOS笔记】View Programming Guide for iOS -1
  5. Linux环境命令大全
  6. JavaScript中的加法运算
  7. magento产品成功添加到购物车后跳转到不同页面 添加 add to cart 按钮
  8. DAG上的动态规划之嵌套矩形
  9. 14款经典的MySQL客户端软件
  10. The Rose
  11. 深入理解java回调机制
  12. 201521123008《Java程序设计》第1周学习总结
  13. C#基本功之泛型
  14. ***阿里云ECS实战配置虚拟主机 + Apache 配置虚拟主机三种方式
  15. pytest-xdist分布式执行测试用例
  16. nginx的autoindex,目录浏览,配置和美化,美观的xslt_stylesheet
  17. SQL Server 分页编号的另一种方式
  18. bzoj3238 差异
  19. Python3练习题系列(08)——代码阅读方法及字典跳转表理解
  20. shell相关知识点

热门文章

  1. windows下新安装的mysql修改root password问题
  2. Laravel安装方法 (windows)
  3. Servlet转码问题
  4. 【新技术】CentOS系统下docker的安装配置及使用详解
  5. ABP之动态WebAPI(二)
  6. php 文件下载
  7. 实用CSS3的transform实现多种动画效果
  8. CSS float
  9. Oracle常用SQL查询
  10. iOS-私有API与runtime