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\),它的最短距离大于油量,我们就可以断定它一定走不通,直接输出 ...
随机推荐
- 关于vue项目font字体图标库导入未显示的问题
运行项目时,弹出以下信息:
- java中this 和 super关键字的作用
emmmmmm也真的是好久没有写过java了,因为项目需要, 最近又必须重新拾起来了,虽然好多东西也都忘得差不多了.... 然后发现 竟然把super和this傻傻分不清.... 开个帖子记录一下: ...
- Python学习3——Python的简单推导
列表推导是一种从其他列表创建列表的方式,类似于数学中的集合推导,列表推导的工作原理非常简单,类似于for循环.(以下代码均在IDLE实现) 最简单的列表推导: >>>[x*x for ...
- [LeetCode] 107 Binary Tree Level Order Traversal II (easy)
原题 层序遍历,从自底向上按层输出. 左→右→中 解法一 : DFS,求出自顶向下的,最后返回时反转一下. class Solution { public: vector<vector<i ...
- 利用DOMNodeInserted监听标签内容变化
var exeFlag = 0;//控制执行业务次数标记$('#list1').bind('DOMNodeInserted', function () { if(!/img/.test($(" ...
- ThinkPHP 入门
ThinkPHP是一个免费.开源的,快速.简单地面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,是为了敏捷Web应用开发和简化企业级应用开发而诞生的.ThinkPHP借鉴国外很多优秀的 ...
- 小白学python-day02-二进制、计算机单位、编程语言分类介绍、
今天是第二天,以下是学习内容总结. 但行努力,莫问前程. ----------------------------------------------------------------------- ...
- CentOS 下配置JDK
从官网上下载jdk到系统中,并解压好 tar –axvf jdk.tr.gz 1. PATH环境变量.作用是指定命令搜索路径,在shell下面执行命令时,它会到PATH变量所指定的路径中查找看是否能找 ...
- IrisSkin2.dll 添加皮肤
使用说明:把控件拖到你的form上,只需一行代码,即可实现整个form包括其所有控件的皮肤的更换,总共有几十套皮肤供使用,非常方便.省去你设计开发软件皮肤系统的时间和精力.全部源代码就一行: skin ...
- div span img对齐,垂直居中对齐问题
我想你们在前端开发中或多或少都遇到过这种问题,文字和图片不能平齐,很是头疼. HTML代码: <div class="">小太阳<span>小太阳</ ...