P1462 通往奥格瑞玛的道路

题目背景

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

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

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

题目描述

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

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

  1. 10

说明

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

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

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

  1. /*
  2. 二分答案
  3. 将花费二分,求到达目的地最小扣血量
  4. 如果大于总血量就不能走,反之则行,更新ans;
  5. 如果到最后都没更新一次ans,就输出AFK;
  6. */
  7. #include<iostream>
  8. #include<cstdio>
  9. #include<cstring>
  10. #include<queue>
  11. #define maxn 50001
  12.  
  13. using namespace std;
  14. int n,m,b,ans,num,cnt,l=0x3f3f3f3f,r=,flag;
  15. int head[maxn],vis[maxn],f[maxn],d[maxn];
  16. queue<int>q;
  17. struct node
  18. {
  19. int u,v,next,dis;
  20. }e[maxn<<];
  21.  
  22. inline int init()
  23. {
  24. int x=,f=;char c=getchar();
  25. while(c>''||c<''){if(c=='-')f=-;c=getchar();}
  26. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  27. return x*f;
  28. }
  29.  
  30. inline void add(int u,int v,int dis)
  31. {
  32. e[++num].v=v;
  33. e[num].next=head[u];
  34. e[num].dis=dis;
  35. head[u]=num;
  36. }
  37.  
  38. bool spfa(int mid)
  39. {
  40. memset(d,0x3f,sizeof d);//这里要搞得大一点不然可能会WA
  41. memset(vis,,sizeof vis);
  42. q.push();vis[]=true;d[]=;
  43. for(int i=;i<=n;i++)
  44. if(f[i]>mid) vis[i]=true;//大于mid的都不能到
  45. if(f[]>mid||f[n]>mid) return false;
  46. while(!q.empty())
  47. {
  48. int u=q.front();q.pop();vis[u]=false;
  49. for(int i=head[u];i;i=e[i].next)
  50. {
  51. int v=e[i].v;
  52. if(d[v]>d[u]+e[i].dis)
  53. {
  54. d[v]=min(d[v],d[u]+e[i].dis);
  55. if(!vis[v])
  56. {
  57. vis[v]=true;
  58. q.push(v);
  59. }
  60. }
  61. }
  62. }
  63. if(d[n]>b) return false;
  64. else return true;
  65. }
  66.  
  67. int main()
  68. {
  69. int x,y,z;
  70. n=init();m=init();b=init();
  71. for(int i=;i<=n;i++)
  72. f[i]=init(),l=min(l,f[i]),r=max(r,f[i]);
  73. for(int i=;i<=m;i++)
  74. {
  75. x=init();y=init();z=init();
  76. add(x,y,z);add(y,x,z);
  77. }
  78. while(l<=r)
  79. {
  80. int mid=(l+r)/;
  81. if(spfa(mid))
  82. {
  83. ans=mid;
  84. r=mid-;
  85. }
  86. else l=mid+;
  87. }
  88. if(ans)printf("%d",ans);
  89. else printf("AFK");
  90. return ;
  91. }

P1462 通往奥格瑞玛的道路(二分答案+最短路)的更多相关文章

  1. 洛谷P1462通往奥格瑞玛的道路——二分答案最短路

    题目:https://www.luogu.org/problemnew/show/P1462 最大值最小问题,二分答案. 代码如下: #include<iostream> #include ...

  2. Luogu P1462 通往奥格瑞玛的道路 二分答案+最短路

    先二分答案,再跑最短路,跑的时候遇到 过路费超过二分的答案的 就不拿他更新最短路 #include<cstdio> #include<iostream> #include< ...

  3. [Luogu P1462] 通往奥格瑞玛的道路 (二分答案+最短路径)

    题面 传送门:https://www.luogu.org/problemnew/show/P1462 Solution 这道题如果去除掉经过城市的收费.那么就是裸的最短路 但是题目要求经过城市中最多的 ...

  4. 洛谷P1462 通往奥格瑞玛的道路[二分答案 spfa 离散化]

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

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

    题目 P1462 通往奥格瑞玛的道路 给定\(n\)个点\(m\)条边,每个点上都有点权\(f[i]\),每条边上有边权,找一条道路,使边权和小于给定的数\(b\),并使最大点权最小. 解析 二分一下 ...

  6. 洛谷 P1462 通往奥格瑞玛的道路——二分+spfa

    上一波链接 https://www.luogu.org/problem/P1462 这道题我们考虑二分答案 然后每次跑一次spfa判断是否能够到达n点 tips:在不考虑负权边的前提下我们写最短路最好 ...

  7. 洛谷 - P1462 - 通往奥格瑞玛的道路 - 二分 - Dijkstra

    https://www.luogu.org/problem/P1462 感觉,要二分最大收费权的城市,把小于等于它的全部插进去,Dijkstra一下求出最小的血量.这样感觉太暴力了. 考虑只有1000 ...

  8. 洛谷 P1462 通往奥格瑞玛的道路 二分 最短路

    #include<cstdio> #include<queue> #include<cstring> #include<algorithm> using ...

  9. 洛谷P1462 通往奥格瑞玛的道路(二分+spfa,二分+Dijkstra)

    洛谷P1462 通往奥格瑞玛的道路 二分费用. 用血量花费建图,用单源最短路判断 \(1\) 到 \(n\) 的最短路花费是否小于 \(b\) .二分时需要不断记录合法的 \(mid\) 值. 这里建 ...

随机推荐

  1. 解决移动端 footer fixd 定位被键盘顶起来的方案

    直接上代码: $(document).ready(function () { var u = navigator.userAgent; var isAndroid = u.indexOf('Andro ...

  2. Python随笔day02

    算术运算符 +   -   *  **   /   //   % 比较运算符 >  <  ==   >=   <=   != Python中提供一种更加简单的比较方式. 当判断 ...

  3. 洛谷 1472 奶牛家谱 Cow Pedigrees

    [题解] DP题,我们用f[i][j]表示有n个节点.高度小于等于j的二叉树的个数.f[i][j]=sigma(f[t][j-1]*f[i-t-1][j-1]) t是1~i-1范围内的奇数. #inc ...

  4. 洛谷 2344 奶牛抗议 Generic Cow Protests, 2011 Feb

    [题解] 我们可以轻松想到朴素的状态转移方程,但直接这样做是n^2的.所以我们考虑采用树状数组优化.写法跟求逆序对很相似,即对前缀和离散化之后开一个权值树状数组,每次f[i]+=query(sum[i ...

  5. HDU 1114 完全背包问题的转化

    题目大意: 根据存钱罐中钱的重量,和每一种钱对应的重量和价值,判断钱能否塞满这个重量,如果能,输出得到的最小价值 这个问题就是要把它和背包问题连接起来,这里钱取得数目是无穷的,所以这里只需要用到完全背 ...

  6. linux下安装并配置vim

    1.安装:sudo apt-get install vim-gtk  安装好后vim,并按“tab”键,可以看到vim的存在,则安装好2.设置更加人性化:sudo vim /etc/vim/vimrc ...

  7. GIS服务器开发资源文档

    JAVA开发gis后台服务可以参照此文学习,持续跟新... 几何基础类库 代表: JTS(Java), GEOS(C++), Shapely(Python) JTS封装了点.线等等对象   数据源实现 ...

  8. 洛谷—— P2196 挖地雷

    https://www.luogu.org/problem/show?pid=2196 题目背景 NOIp1996提高组第三题 题目描述 在一个地图上有N个地窖(N<=20),每个地窖中埋有一定 ...

  9. Java并发:线程安全的单例模式

    转载请注明出处:jiq•钦'stechnical Blog 1.饿汉式 public class Singleton { private final static Singleton INSTANCE ...

  10. C语言的数组初始化

    http://blog.csdn.net/sibylle/article/details/2026915 一直以为 int a[256]={0};是把a的所有元素初始化为0,int a[256]={1 ...