Luogu P1462 && P1951
首先有两个最短路,可以考虑把一个东西拿出来二分,也就是可以二分最小值,但是注意不要用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的更多相关文章
- luogu P1462 通往奥格瑞玛的道路--spfa+二分答案
P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...
- [Luogu P1462] 通往奥格瑞玛的道路 (二分答案+最短路径)
题面 传送门:https://www.luogu.org/problemnew/show/P1462 Solution 这道题如果去除掉经过城市的收费.那么就是裸的最短路 但是题目要求经过城市中最多的 ...
- 【luogu P1462 通往奥格瑞玛的道路】 题解
题目链接:https://www.luogu.org/problemnew/show/P1462 记住HP=0也叫死. #include <queue> #include <cstd ...
- Luogu P1462 通往奥格瑞玛的道路(最短路+二分)
P1462 通往奥格瑞玛的道路 题面 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己 ...
- luogu P1462 通往奥格瑞玛的道路
嘟嘟嘟 这道题的题面相当的迷,我看了半天都没懂.最后看了题解的解释才懂. 他是这么个意思:对于所有能活着走到终点的路径,输出每一条路径中过路费最多的城市的最小值. 那么自然想到二分过路费,然后用dij ...
- Luogu P1462 通往奥格瑞玛的道路 二分答案+最短路
先二分答案,再跑最短路,跑的时候遇到 过路费超过二分的答案的 就不拿他更新最短路 #include<cstdio> #include<iostream> #include< ...
- Luogu P1462 通往奥格瑞玛的道路【二分/最短路】
题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯, ...
- luogu题解 P1462 【通往奥格瑞玛的道路】二分+spfa
题目链接: https://www.luogu.org/problemnew/show/P1462 思路: 又是一道水题,很明显二分+最短路 而且这道题数据非常水,spfa有个小错误居然拿了91分还比 ...
- Luogu P1951 收费站_NOI导刊2009提高(2)
二分答案+堆优Dijkstra 这个题有些巧妙. 首先,因为要在油量耗完之前跑到终点,所以我们可以用最短路.只要从\(s\)出发到\(t\),它的最短距离大于油量,我们就可以断定它一定走不通,直接输出 ...
随机推荐
- 使用反射机制将对象序列化Json
一 思路 获取对象的Class对象. 获取对象的属性数组, 迭代属性数据拼接属性名与属性值, 存入List. 将List转换为流库, 再将流库使用逗号分隔符转换为字符串, 去掉首尾的逗号 二 代码 p ...
- dubbo框架设计学习
1.整体设计 (1)架构图 图例说明: 图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口. 图中从下至上分为十层,各层均为单向依赖,右 ...
- 【CYH-01】小奔的国庆练习赛:赛后标程
前排鸣谢@找寻 大佬 emm-由于头一次举办公开赛所以--准备不是很充分,所以说题解也没有备好,在这里表示歉意. 欢迎大家来发布题解,在此我们可以提供AC代码,供大家参考. T1 解析:这一题可能栈溢 ...
- 【转】Spring事务详解
1.事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交,那在没有Spring帮我们管理事务 ...
- TinycoreLinux的安装使用
下载 http://www.tinycorelinux.net/7.x/x86_64/release/ distribution_files/ 05-Apr-2016 07:29 - src/ 24- ...
- vijos p1484 ISBN号码
#include<iostream>#include<string>#include<cctype>using namespace std;int main() { ...
- sqlserver2014创建数据库时,错误提示如下:尝试打开或创建物理‘c:\数据库\db.mdf’时,Create File遇到操作系统错误5(拒绝访问)
CREATE DATABASE test1 ON PRIMARY ( NAME =test1, FILENAME='C:\Program Files\test1.mdf',SIZE=10240K ...
- .net持续集成sonarqube篇之项目管理与用户管理
系列目录 删除项目 在学习阶段,我们可能需要经常删除已构建的项目,在sonarqube中想要删除一个项目有两个入口,都在Administration导航栏内. 在项目内部的管理界面删除 如果项目处于打 ...
- 第15个算法-实现 Trie (前缀树)(LeetCode)
解法代码来源 :https://blog.csdn.net/whdAlive/article/details/81084793 算法来源:力扣(LeetCode)链接:https://leetcode ...
- 使用jquery删除链接所在的行
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...