洛谷 P2832 行路难
这个最短路有点special,会有疲劳度的加成效应,这个时候应该怎么办呢?
难就难在,如果走一条路比另一条路长,但是用的边少,那么这条路并不一定就更差。
我们要是能解决这个问题,就可以做出本题。
想一想两种常用的单源最短路的实现过程,dij是优先队列每次弹出非标记点中最近的那个,而spfa则可以看成bfs的延伸,用的边少的一定是会比用的边多的先被扩展到的。
如果这么一想,那么选择就很显然了:我们如果用spfa的话,顺带记录一下疲劳值,是一定能找出答案的。我们考虑spfa的过程,如果 d[x](目前要扩展的点)+ val[i] (边权)+pl(队列里这个点的疲劳值)>= d[to](边的出点),那么这条路径一定是无用的,因为这样走到to的路径长度不仅没变短,反而疲劳值更大(注意spfa的队列里的疲劳值肯定是单调不减的),所以肯定不会是答案,而spfa的过程也是不允许这种情况再入队列的;相反的,如果d[x] + val[i] + pl< d[to],那么说明这条路径还有可能是答案,我们把它加到队列里去,但这并不会影响之前已经入队列的疲劳值更小的状态的寻找答案的过程。
最后就是打印最短路的过程了,显然不能像以前一样开个p[i]记录最短路树的上一个节点,因为这种特殊的spfa求出的根本就不是一颗树(其实普通最短路也不一定是一棵树,不过很多边是等价的于是我们可以把等价的边删的只剩一条就可以构建最短路树)!而是一个复杂的DAG!
但如果我们记录队列里的每个状态是由哪个状态转移过来的,答案就可以轻松找到了,具体操作可以看代码、、、
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=10005,M=200005,inf=2e9; inline int read(){
int x=0; char ch=getchar();
for(;!isdigit(ch);ch=getchar());
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
return x;
} int to[M*2],ne[M*2],hd[N],val[M*2],D[N];
int ans=inf,P,num,n,m,l,r;
struct node{
int x,pl,pr,d;
}q[10000005]; inline void add(int x,int y,int z){
to[++num]=y,ne[num]=hd[x],hd[x]=num,val[num]=z;
} inline void solve(){
q[l=r=1]=(node){1,0,0,0},D[1]=0; for(node now;l<=r;l++){
now=q[l];
if(now.x==n&&now.d<ans) ans=now.d,P=l; for(int i=hd[now.x],dd;i;i=ne[i]) if((dd=now.d+now.pl+val[i])<D[to[i]])
D[to[i]]=dd,q[++r]=(node){to[i],now.pl+1,l,dd};
}
} void Print(int x){
if(!x) return;
Print(q[x].pr);
printf("%d ",q[x].x);
} int main(){
n=read(),m=read(),fill(D+1,D+n+1,inf);
for(int u,v,w;m;m--) u=read(),v=read(),w=read(),add(u,v,w);
solve(),printf("%d\n",ans);
Print(P);
return 0;
}
洛谷 P2832 行路难的更多相关文章
- 洛谷P2832 行路难 分析+题解代码【玄学最短路】
洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...
- 洛谷P1265 公路修建(Prim)
To 洛谷.1265 公路修建 题目描述 某国有n个城市,它们互相之间没有公路相通,因此交通十分不便.为解决这一“行路难”的问题,政府决定修建公路.修建公路的任务由各城市共同完成. 修建工程分若干轮完 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
- 洛谷P1710 地铁涨价
P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交 讨论 题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...
- 洛谷P1371 NOI元丹
P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交 讨论 题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...
- 洛谷P1538迎春舞会之数字舞蹈
题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...
随机推荐
- HDU 3333-Turing Tree-线段树+离散+离线
Description After inventing Turing Tree, 3xian always felt boring when solving problems about interv ...
- Python基础 第三章 使用字符串(3)字符串方法&本章小结
字符串的方法非常之多,重点学习一些最有用的,完整的字符串方法参见<Python基础教程(第三版)>附录B. 模块string,虽然风头已小,但其包含了一些字符串方法中没有的常量和函数,故将 ...
- python+socket实现网络信息交互及文件传输
Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket又称"套接字",应用程序通常通过"套接字" ...
- S4VM解析
S4VM解析 2018年08月03日 15:20:59 stringlife 阅读数 1233 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. ...
- go环境变量配置 (GOROOT和GOPATH)的区别和含义
GOROOT就是go的安装路径 在~/.bash_profile中添加下面语句: GOROOT=/usr/local/go export GOROOT 当然, 要执行go命令和go工具, 就要配置go ...
- MySql学习- 存储引擎简介
mysql可以将数据以不同的技术存储在文件(内存)中,这种技术就称为存储引擎. 每一种存储引擎使用不同的存储机制.索引技巧.锁定水平,最终提供广泛且不同的功能. MySQL支持的存储引擎: MyISA ...
- Pytorch中的自编码(autoencoder)
Pytorch中的自编码(autoencoder) 本文资料来源:https://www.bilibili.com/video/av15997678/?p=25 什么是自编码 先压缩原数据.提取出最有 ...
- 安卓开发之Toolbar返回键
本文前三步演示了为Toolbar添加返回键并实现返回的步骤,第四步给出了设置返回键颜色的方法. 1.在xml布局中引用toolbar: <android.support.design.widge ...
- RobHess的SIFT环境配置
平台:win10 x64 +VS 2015专业版 +opencv-2.4.11 + gtk_-bundle_2.24.10_win32 参考博客:https://www.cnblogs.com/cql ...
- MyBatis 插入失败后爆出 500 ,如何捕获异常?
我们在使用 Mybatis 的时候,会出现以下场景 数据表里有一些字段被设置为了 不可为 null 但是我们的用户在提交表单的时候没有提交所需的 字段数据 然后 Mybatis 在数据库做操作的时候就 ...