题目描述

在艾泽拉斯,有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。


让最大值最小,可以考虑二分答案。

对于每次二分出的值mid,我们连接上边权小于等于mid的边,然后以血量为代价跑一遍最短路,如果最短路小于等于血量的话,那么这个mid就是合法的。

时间复杂度为O((N+M)log(N+M)logAns)。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#define maxn 10001
#define maxm 50001
using namespace std;
int n,m,c,val[maxn];
long long b;
inline int read(){register int x(0),f(1); register char c(getchar());while(c<'0'||'9'<c){ if(c=='-') f=-1; c=getchar(); }while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}struct edge{int u,v,w;
}e[maxm];
vector<int> to[maxn],w[maxn];long long dis[maxn];
int ans=-1;
bool vis[maxn];
priority_queue< pair<int,int>,vector< pair<int,int> >,greater< pair<int,int> > > q;
inline bool dijkstra(){memset(dis,0x3f,sizeof dis),memset(vis,false,sizeof vis);q.push(make_pair(dis[1]=0,1));while(q.size()){int u=q.top().second; q.pop();if(vis[u]) continue; vis[u]=true;for(register int i=0;i<to[u].size();i++){int v=to[u][i];if(dis[v]>dis[u]+w[u][i]) dis[v]=dis[u]+w[u][i],q.push(make_pair(dis[v],v));}}return dis[n]<=b;
}
inline void binary(){int l=0,r=c,mid;while(l<=r){mid=l+r>>1;for(register int i=1;i<=n;i++) to[i].clear(),w[i].clear();for(register int i=1;i<=m;i++) if(val[e[i].u]<=mid&&val[e[i].v]<=mid){int u=e[i].u,v=e[i].v;to[u].push_back(v),w[u].push_back(e[i].w);to[v].push_back(u),w[v].push_back(e[i].w);}if(dijkstra()) ans=mid,r=mid-1;else l=mid+1;}
}int main(){n=read(),m=read(),scanf("%lld",&b);for(register int i=1;i<=n;i++) val[i]=read(),c=max(c,val[i]);for(register int i=1;i<=m;i++) e[i].u=read(),e[i].v=read(),e[i].w=read();binary();if(ans==-1) puts("AFK");else printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/akura/p/11066818.html

luogu P1462 通往奥格瑞玛的道路相关推荐

  1. Luogu P1462 通往奥格瑞玛的道路(最短路+二分)

    P1462 通往奥格瑞玛的道路 题面 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己 ...

  2. 洛谷:P1462 通往奥格瑞玛的道路

    题目连接:P1462 通往奥格瑞玛的道路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目要求是假如有多条路线,求出每条路线的最大值然后选出其中的最小值. 一般这种问法都是二分. ...

  3. P1462 通往奥格瑞玛的道路(二分+dijkstra)

    P1462 通往奥格瑞玛的道路https://www.luogu.com.cn/problem/P1462  一道很不错的题,考察了二分和最短路 #include <iostream> # ...

  4. 洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA

    洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA 二分交费最多的一次的钱数 然后只将符合要求的边加入图中 如果到终点的最短路大于等于血量 或者直接起点不能到达终点 那么说明不符合要求 需要 ...

  5. 洛谷P1462 通往奥格瑞玛的道路 题解

    洛谷P1462 通往奥格瑞玛的道路 题解 题目链接:P1462 通往奥格瑞玛的道路 题意:在艾泽拉斯,有 nnn 个城市.编号为 1,2,3,-,n1,2,3,\ldots,n1,2,3,-,n . ...

  6. P1462 通往奥格瑞玛的道路

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

  7. 【洛谷】【二分答案+最短路】P1462 通往奥格瑞玛的道路

    在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量有一天他醒来后发现自己居然到了联盟的主城暴风城在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目背景 [题目描述:] 在艾泽拉斯 ...

  8. 【洛谷】P1462 通往奥格瑞玛的道路

    题目地址: https://www.luogu.com.cn/problem/P1462 题目背景: 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量.有一天他醒来后发现自己居然到了联盟 ...

  9. P1462 通往奥格瑞玛的道路[最短路+二分+堆优化]

    题目来源:洛谷 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描 ...

最新文章

  1. 从零点五开始用Unity做半个2D战棋小游戏(四)
  2. [Swift]LeetCode1147. 段式回文 | Longest Chunked Palindrome Decomposition
  3. mysql表变量临时表_表变量和临时表详解
  4. 【工作经验分享】java图片转文字
  5. 硬件基础 —— 电容
  6. 销售管理系统 java_用Java从零写一个B2C商城,看完不要再说自己没有实战经验了!...
  7. 论文摘要这么重要,你却不知道怎么写?
  8. 【opencv学习】透视变换矩阵
  9. 目标赋予生命的意义和目的
  10. mysql 导出所有表_Mysql导出(多张表)表结构及表数据 mysqldump用法
  11. 选项不属于HTML语言特点,Web前端开发初级模拟测试卷一(2)
  12. mach3加工回差_mach3 中文说明书.pdf
  13. 文本框改变之onpropertychange事件
  14. win10更新完,每次重启电脑都提示 未安装任何音频输出设备
  15. JS原型与原型链总结
  16. 常用工具:用yEd工具画流程图实用步骤
  17. css如何去掉图片里面存在的背景色
  18. Mysql学习笔记(一)学完就出师系列哈哈哈
  19. JS获取本地IP显示隐藏IP
  20. 正方验证码智能识别及教务系统模拟登录

热门文章

  1. python实现批量转换文件编码(批转换编码示例)
  2. sed在行首(行尾)添加字符串;在某行后添加多行字符串-转
  3. sqlite的联表查询-转
  4. 1017. A除以B (20)-PAT乙级真题
  5. java 重载匹配_关于Java重载方法匹配优先级
  6. plsql初始错误sql.net未正确安装_ANSYS | ansys18.0完整安装过程及常见问题解决方案[图文]...
  7. 外点罚函数matlab程序_关于图像轮廓识别的程序实现
  8. 连接MySQL错误:Can't connect to MySQL server (10060)
  9. oracle起定时任务,每隔1秒执行一次
  10. Cyrus SASL Libary学习