洛谷 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的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...
随机推荐
- springboot service dockerfile
FROM java:8u111 MAINTAINER ianthony7@163.com # 定义变量 ENV WORK_DIR /opt ENV LOG_DIR /data/logs EXPOSE ...
- opencv实现人脸识别(二) 人脸图像采集模块
这一步我们开始搭建第一个模块,用来检测到图像中的人脸位置,并将它拍下来保存在指定路径 流程图: 代码实现: import cv2 def pic(cam): # 调用笔记本内置摄像头,所以参数为0,如 ...
- 第十章 MIZ702 ZYNQ制作UBOOT固化程序
10.0难度系数★☆☆☆☆☆☆ 10.1是什么是固化 我们前几章将的程序都是通过JTAG先下载bit流文件,再下载elf文件,之后点击Run As来运行的程序.JTAG的方法是通过TCL脚本来初始化P ...
- (转)如何真正实现由文档驱动的API设计?
前言 本文主要介绍了一种新的开发思路:通过反转开发顺序,直接从API文档中阅读代码.作者认为通过这种开发方式,你可以更清楚地知道文档表达出什么以及它应该如何实现. 如果单从API文档出发,由于信息量不 ...
- SpringBoot下实现MongoDB字段类型转换器
1 目的 MongoDB Java String LocalDateTime 2 实现 先定义实体类 @Data // lombok @Accessors(chain = true) @Documen ...
- 关于MQ的几件小事(七)如果让你设计一个MQ,你怎么设计
其实回答这类问题,说白了,起码不求你看过那技术的源码,起码你大概知道那个技术的基本原理,核心组成部分,基本架构构成,然后参照一些开源的技术把一个系统设计出来的思路说一下就好 比如说这个消息队列系统,我 ...
- java中long类型转换为int类型
由int类型转换为long类型是向上转换,可以直接进行隐式转换,但由long类型转换为int类型是向下转换,可能会出现数据溢出情况: 主要以下几种转换方法,供参考: 一.强制类型转换 [java] l ...
- phpstorm 习惯设置
phpstorm 习惯设置 1. 字体:Source Code Pro 大小:14 链接: https://pan.baidu.com/s/1HLpbduBHFvbq1a10QV4uCg 提取码: y ...
- TF版网络模型搭建常用代码备忘
本文主要介绍如何搭建一个网络并训练 最近,我在写代码时经常碰到这样的情况,明明记得代码应该怎么写,在写出来的代码调试时,总是有些小错误.原因不是接口参数个数不对,就是位置不对.为了节约上网查找时间,现 ...
- 008.MVC与数据库的交互
使用ASP.NET MVC实现向数据库插入数据的步骤(程序): (删除,修改,查找)步骤1:创建数据库,创建要使用的表(数据) 表中可以事先插入测试数据步骤2:新建项目,写代码2.1)在配置文件中设置 ...