首先有两个最短路,可以考虑把一个东西拿出来二分,也就是可以二分最小值,但是注意不要用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. 摄像头驱动的使能配置、V4L2编程接口的设计应用

    摄像头采集子系统 一.摄像头驱动的使能配置 摄像头软件驱动构架 摄像头采集系统由上图所示,硬件(摄像头) -> 驱动(Linux内核配置中,选择支持V4L2的驱动选项) -> V4L2接口 ...

  2. 【HDU - 1560】DNA sequence (dfs+回溯)

    DNA sequence 直接中文了 题目描述 21世纪是生物科技飞速发展的时代.我们都知道基因是由DNA组成的,而DNA的基本组成单位是A,C,G,T.在现代生物分子计算中,如何找到DNA之间的最长 ...

  3. SP1026 FAVDICE - Favorite Dice[期望DP]

    也许更好的阅读体验 \(\mathcal{Description}\) 一个\(n\)面的骰子,求期望掷几次能使得每一面都被掷到 输入有\(T\)组数据,每次输入一个\(n\) 输出保留两位小数 \( ...

  4. 【数据结构】B树、B+树详解

    B树 前言 首先,为什么要总结B树.B+树的知识呢?最近在学习数据库索引调优相关知识,数据库系统普遍采用B-/+Tree作为索引结构(例如mysql的InnoDB引擎使用的B+树),理解不透彻B树,则 ...

  5. VS Code 安装 LeetCode 插件

    练习算法绕不开的一个网站就是力扣,很多小伙伴为了拿到大厂 offer,刷题都刷到吐了. 然而如果直接在 LeetCode 上写代码,那是很痛苦的一件事,那就相当于用 txt 写代码一样,没有 IDE ...

  6. 快速清理maven仓库中下载错误的文件

    有时候使用pom文件下载依赖文件的时候突然网络异常,可能会出现依赖文件出现破损,导致怎么都不能使用,也没有重新下载. 之前解决办法是找到出现破损的文件并删除,让其重新下载,但是这样效率很低,也很难找到 ...

  7. 菜单(menu)

    菜单 menu ——菜单默认隐藏 ——实现菜单的接口: Menu,父接口,用于创建主菜单 SubMenu继承Menu接口,用于创建子菜单 ContextMenu接口继承Menu接口,用于创建上下文菜单 ...

  8. http.client.ResponseNotReady: Request-sent

    最近学习python写接口测试,使用的是connection.request 发现在测试一个发送报告接口时候,同一个接口,同样的脚本,只是一个参数传不同值,总提示:http.client.Respon ...

  9. T-SQL 恢复数据库

    USE master GO ALTER DATABASE DEMO SET SINGLE_USER GO ALTER DATABASE DEMO SET EMERGENCY GO DBCC CHECK ...

  10. 一次简单的SQL手工注入

    1. 首先要了解SQL注入的原理:   SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 具体来说,它是利 ...