luogu题解 P1462 【通往奥格瑞玛的道路】二分+spfa
题目链接:
思路:
又是一道水题,很明显二分+最短路
而且这道题数据非常水,spfa有个小错误居然拿了91分还比正解快
我们二分金钱数,节点权值大于二分值的都不能走。二分中跑spfa,如果不能走到终点,即dis[n]>=b,则说明二分值偏小。
注意:
血量\(<=0\)则说明不能达到
二分不要写错,这次居然一遍写对
有个比较明显的优化,显然最小值一定是某个节点的权值,所以我们可以排序离散化后二分下标,但是我没有写
SLF优化后快了100+ms
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#include <cctype>
#define ri register int
#define ll long long
using namespace std;
const ll inf=9926081792;
const int maxn=10005;
const int maxm=50005;
ll g[maxn],dis[maxn];
int h[maxn],num_edge=0;
bool vis[maxn];
int n,m;
ll b;
struct Edge{
int ne,to;
ll dis;
}edge[maxm<<2];
inline void add_edge(int f,int t,ll dis){
edge[++num_edge].ne=h[f];
edge[num_edge].to=t;
edge[num_edge].dis=dis;
h[f]=num_edge;
}
template <class T>inline void read(T &x){
x=0;int ne=0;char c;
while(!isdigit(c=getchar()))ne=c=='-';
x=c-48;
while(isdigit(c=getchar()))x=(x<<3)+(x<<1)+c-48;
x=ne?-x:x;
return ;
}
inline int spfa(ll len){
deque<int>q;
int u,v,c;
while(q.size())q.pop_front();
//memset(vis,0,sizeof(vis));
for(ri i=1;i<=n;i++){dis[i]=inf,vis[i]=0;}
dis[1]=0,vis[1]=1;
q.push_back(1);
while(!q.empty()){
u=q.front();q.pop_front();
for(ri i=h[u];i;i=edge[i].ne){
v=edge[i].to;
if((len-g[v]>=0)&&dis[v]>dis[u]+edge[i].dis){
dis[v]=dis[u]+edge[i].dis;
if(q.empty()){
if(!vis[v]){
vis[v]=1;
q.push_back(v);
}
}
c=q.front();
if(dis[v]>dis[c]){
if(!vis[v]){
vis[v]=1;
q.push_back(v);
}
}
else if(!vis[v]){
vis[v]=1;
q.push_front(v);
}
}
}
vis[u]=0;
}
if(dis[n]>=b)return 0;
return 1;
}
int main(){
ll l=1,r=n;
int u,v,c;
read(n),read(m),read(b);
for(ri i=1;i<=n;i++)read(g[i]);
for(ri i=1;i<=m;i++){
read(u),read(v),read(c);
add_edge(u,v,c);
add_edge(v,u,c);
}
if(!spfa(inf)){
puts("AFK");
return 0;
}
while(l<r){
ll mid=(l+r)>>1;
if(spfa(mid))r=mid;
else l=mid+1;
}
printf("%d",r);
return 0;
}
luogu题解 P1462 【通往奥格瑞玛的道路】二分+spfa的更多相关文章
- 洛谷 P1462 通往奥格瑞玛的道路——二分+spfa
上一波链接 https://www.luogu.org/problem/P1462 这道题我们考虑二分答案 然后每次跑一次spfa判断是否能够到达n点 tips:在不考虑负权边的前提下我们写最短路最好 ...
- [Luogu P1462] 通往奥格瑞玛的道路 (二分答案+最短路径)
题面 传送门:https://www.luogu.org/problemnew/show/P1462 Solution 这道题如果去除掉经过城市的收费.那么就是裸的最短路 但是题目要求经过城市中最多的 ...
- P1462 通往奥格瑞玛的道路 (二分+最短路)
题目 P1462 通往奥格瑞玛的道路 给定\(n\)个点\(m\)条边,每个点上都有点权\(f[i]\),每条边上有边权,找一条道路,使边权和小于给定的数\(b\),并使最大点权最小. 解析 二分一下 ...
- 洛谷 - P1462 - 通往奥格瑞玛的道路 - 二分 - Dijkstra
https://www.luogu.org/problem/P1462 感觉,要二分最大收费权的城市,把小于等于它的全部插进去,Dijkstra一下求出最小的血量.这样感觉太暴力了. 考虑只有1000 ...
- 【Luogu】P1462通往奥格瑞玛的道路(二分答案+SPFA)
题目链接 导致我WA十几遍的原因居然是最大值不够大……以后再也不相信memset(dis,127/3,sizeof(dis))了. 此题先将花费排序,然后二分最大花费,spfa判断解是否可行.spfa ...
- 洛谷P1462 通往奥格瑞玛的道路[二分答案 spfa 离散化]
题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯, ...
- Luogu P1462 通往奥格瑞玛的道路 二分答案+最短路
先二分答案,再跑最短路,跑的时候遇到 过路费超过二分的答案的 就不拿他更新最短路 #include<cstdio> #include<iostream> #include< ...
- 洛谷P1462通往奥格瑞玛的道路——二分答案最短路
题目:https://www.luogu.org/problemnew/show/P1462 最大值最小问题,二分答案. 代码如下: #include<iostream> #include ...
- 洛谷 P1462 通往奥格瑞玛的道路(spfa+二分搜索)(4boy)
原题:http://www.luogu.org/problem/show?pid=1462#sub 4boy: 大意:给出n个城市,有m条路,每经过一个城市都要交钱,每经过一条道路都要扣HP,有HP上 ...
- 洛谷 P1462 通往奥格瑞玛的道路 二分 最短路
#include<cstdio> #include<queue> #include<cstring> #include<algorithm> using ...
随机推荐
- 后盾网lavarel视频项目---lavarel中的tinker是什么
后盾网lavarel视频项目---lavarel中的tinker是什么 一.总结 一句话总结: 是用来调试laravel,可以打印变量或对象信息,显示函数代码,对数据库写入和查询数据 laravel中 ...
- LC 677. Map Sum Pairs
Implement a MapSum class with insert, and sum methods. For the method insert, you'll be given a pair ...
- html5内容快速学习
accessKey 快捷键 <input type="text" accessType="m"/> <!-- chrome按下快捷键alt+m ...
- 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_2 响应之返回值是String类型
返回字符串 新建一个response的页面 新建后台Controller类 视图解析器配置的前缀地址 是WEB-INF下的pages下的页面. 创建pages文件夹在下面创建success.jsp页面 ...
- Winform之跨线程更新UI
Winform之跨线程更新UI 使用`Invoke`或者`BeginInvoke`与UI线程交互示例 参考及源码 使用Invoke或者BeginInvoke与UI线程交互示例 private void ...
- 【ABAP系列】SAP ABAP 带有参数的AMDP的创建
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 带有参数的AM ...
- Django与Cookie
Cookie Cookie的由来 大家都知道HTTP协议是无状态的.无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也 ...
- 03-初识JavaScript
一. JavaScript简介(了解) 1. JavaScript的历史背景介绍 布兰登 • 艾奇(Brendan Eich,1961年-),1995年在网景公司,发明的JavaScript. 一开始 ...
- webdriervAPI(多窗口切换)
两个方法 driver.current_window_handle 获取当前窗口句柄 driver.window_handles 获取所有窗口句柄 from selenium import webdr ...
- LINQ查询表达式详解(2)——查询表达式的转换
简介 C#在执行LINQ查询表达式的时候,并不会指定其执行语义,而是将查询表达式转换为遵循查询表达式模式的方法的调用.具体而言,查询表达式将转换为以下名称的调用:Where.Select.Select ...