首先有两个最短路,可以考虑把一个东西拿出来二分,也就是可以二分最小值,但是注意不要用SPFA他死了,可以用Dij跑最短路,再二分,效率会大大提高

1.SPFA

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+;
const int M=1e5+;
int n,m,tot,head[M];
long long f[N],d[N],b,a[N];
bool vis[N];
struct node{int to,next;long long val;}e[M];
void add(int u,int v,int w){e[++tot].to=v;e[tot].next=head[u];e[tot].val=w;head[u]=tot;}
bool spfa(long long k){
queue<int> q;
if(a[]>k||a[n]>k)return false;
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++)d[i]=LLONG_MAX;
d[]=;q.push();vis[]=;
while(!q.empty()){
int u=q.front();q.pop();vis[u]=;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to,z=e[i].val;
if(a[v]>k)continue;
if(d[v]>d[u]+z){
d[v]=d[u]+z;
if(!vis[v])q.push(v),vis[v]=;
}
}
}
return d[n]<=b;
}
int main(){
//freopen("a.in","r",stdin);
long long c;
scanf("%d%d%lld",&n,&m,&b);
for(int i=;i<=n;i++)
scanf("%lld",&f[i]),a[i]=f[i];
for(int i=,u,v;i<=m;i++){
scanf("%d%d%lld",&u,&v,&c);
add(u,v,c);add(v,u,c);
}
sort(f+,f+n+);
int l=,r=n,best=-;
while(l<r){
int mid=(l+r)>>;
if(spfa(f[mid]))
best=mid,r=mid-;
else
l=mid+;
}
if(spfa(f[l]))best=l;
if(best<)puts("AFK");
else printf("%lld\n",f[best]);
}

2.DIJ

#include<bits/stdc++.h>
#pragma GCC optimize("O2")
#pragma GCC optimize("O3")
using namespace std;
const int N=1e4+;
const int M=1e5+;
int n,m,tot,head[M],st,ed;
int f[N],d[N],b,a[N];
bool vis[N];
struct node{int to,next,val;}e[M];
priority_queue<pair<int,int> > q;
void add(int u,int v,int w){e[++tot].to=v;e[tot].next=head[u];e[tot].val=w;head[u]=tot;}
bool spfa(int k){
if(a[st]>k||a[ed]>k)return false;
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++)d[i]=INT_MAX;
d[st]=;q.push(make_pair(,st));;
while(!q.empty()){
int u=q.top().second;q.pop();
if(vis[u])continue;
vis[u]=;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to,z=e[i].val;
if(a[v]>k)continue;
if(d[v]>d[u]+z){
d[v]=d[u]+z;
q.push(make_pair(-d[v],v));
}
}
}
return d[ed]<=b;
}
int main(){
scanf("%d%d%d%d%d",&n,&m,&st,&ed,&b);
for(int i=;i<=n;i++)
scanf("%d",&f[i]),a[i]=f[i];
for(int i=,u,v,c;i<=m;i++){
scanf("%d%d%d",&u,&v,&c);
add(u,v,c);add(v,u,c);
}
sort(f+,f+n+);
int l=,r=n,best=-;
while(l<r){
int mid=(l+r)>>;
if(spfa(f[mid]))
best=mid,r=mid-;
else
l=mid+;
}
if(spfa(f[l]))best=l;
if(best<)puts("-1");
else printf("%d\n",f[best]);
}

Luogu P1462 && P1951的更多相关文章

  1. luogu P1462 通往奥格瑞玛的道路--spfa+二分答案

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

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

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

  3. 【luogu P1462 通往奥格瑞玛的道路】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1462 记住HP=0也叫死. #include <queue> #include <cstd ...

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

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

  5. luogu P1462 通往奥格瑞玛的道路

    嘟嘟嘟 这道题的题面相当的迷,我看了半天都没懂.最后看了题解的解释才懂. 他是这么个意思:对于所有能活着走到终点的路径,输出每一条路径中过路费最多的城市的最小值. 那么自然想到二分过路费,然后用dij ...

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

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

  7. Luogu P1462 通往奥格瑞玛的道路【二分/最短路】

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

  8. luogu题解 P1462 【通往奥格瑞玛的道路】二分+spfa

    题目链接: https://www.luogu.org/problemnew/show/P1462 思路: 又是一道水题,很明显二分+最短路 而且这道题数据非常水,spfa有个小错误居然拿了91分还比 ...

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

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

随机推荐

  1. 能访问的谷歌 http://209.116.186.231/

    能访问的谷歌 http://209.116.186.231/

  2. 找bug的过程

    关于昨天程序出差我找bug的过程记录 昨天才程序 https://www.cnblogs.com/pythonywy/p/11006273.html ├── xxxx │ ├── src.py │ └ ...

  3. David与Vincent的博弈游戏[树型DP]

    \(\mathcal{Description}\) \(\mathcal{Solution}\) 根据题意,我们知道 根节点深度为1,深度为 奇数 的节点由\(David\)移动,我们称为\(D\)点 ...

  4. Amdahl定律理解

    其中,a为并行计算部分所占比例,k为并行处理的个数. 当1-a=0时,(没有串行,只有并行)最大加速比s=n: 当a=0时,(只有串行,没有并行)最小加速比s=1: 当k→∞时,s → 1 /(1-a ...

  5. Linux AUFS 文件系统

    AUFS 的英文全称为 Advanced Mult-Layered Unification Filesystem,曾经是 Another Mult-Layered Unification Filesy ...

  6. mount命令中offset参数的意义

    mount命令中offset参数的意义        感觉好久没有来写东西了,最近一直忙个不停,今天也一样,总感觉时间不够用,唉,这里来临时总结一下工作中的一点小收获吧.今天要说的是我们常用的解压IM ...

  7. linux初学者-CIFS网络文件系统篇

    linux初学者-CIFS网络文件系统篇 CIFS是一种通用网络文件系统,主要用于网络设备之间的文件共享.CIFS可以在linux系统和windows系统之间共享文件,因此这种文件系统主要用于客户端是 ...

  8. Mysql处理中文乱码的问题

    一开始在创建完毕数据库和数据表之后,插入中文发现在mysql命令行和在sqlyog终端上看都是乱码,查看了一些文章,写的内容都一样,无非是如下几个步骤: 1:修改数据库字符集为utf8 2:修改数据表 ...

  9. FD limit (65535) too low for maxconn=65535/maxsock=131084.Please raise 'ulimit-n' to 131084 or more to avoid any trouble.

    在安装完Haproxy启动时报错,诸如:FD limit (65535) too low for maxconn=65535/maxsock=131084.Please raise 'ulimit-n ...

  10. vue+ elementUI 打包发布到服务器后,element-icons.woff文件404

    vue项目打包部署到服务器,静态资源文件404 js文件404问题        原因:打包的项目静态资源的路径需要设置为绝对路径.如果是相对路径会出错 解决办法:修改config/index.js文 ...