洛谷 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的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...
随机推荐
- 剑指offer45:扑克牌顺子
1 题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话, ...
- Prime Number(CodeForces-359C)【快速幂/思维】
题意:已知X,数组arr[n],求一个分式的分子与分母的最大公因数.分子为ΣX^arr[i],分母为X^Σarr[i],数组为不递减序列. 思路:比赛的时候以为想出了正确思路,WA掉了很多发,看了别人 ...
- SMTP实现发送邮箱1
#include "stdafx.h" #include <iostream> #include <WinSock2.h> using namespace ...
- TCP协议探究(一):报文格式与连接建立终止
一 TCP:传输控制协议报文格式 1 TCP服务 提供面向连接.可靠的字节流服务 面向连接意味着两方通信,不支持多播和广播 可靠性的支持: 应用数据被分割成TCP认为最适合发送的数据块.由TCP传递给 ...
- Windows编程 Windows程序的生与死(中)
<pre style=""><pre class="cpp" name="code">1 #include < ...
- Git详细操作
Git详细操作 一.本地配置 1公钥钥配置 1.参考帮助文档:https://gitee.com/help/ 仓库管理 =公钥管理 =生成/添加SSH公钥 ssh-keygen -t rsa -C & ...
- [转载]IMDB文件格式
[转载]IMDB文件格式 来源:LMDB的全称是Lightning Memory-Mapped Database,闪电般的内存映射数据库.它文件结构简单,一个文件夹,里面一个数据文件,一个锁文件.数据 ...
- JS — 事件的相关概念和DOM
JS是以事件驱动为核心的一门语言. 事件的三要素:事件源.事件.事件驱动程序. 例如: <body> <div id="box1"></div> ...
- Django + mysql 在创建数据库出错
错误:django.db.utils.OperationalError: (1366, "Incorrect string value: '\\xE6\\x96\\x87\\xE7\\xAB ...
- CentOS自动备份MySql
1.确认Crontab是否安装 service crond startcrontab -l 2.编写备份脚本 cd mkdir backup cd backup vim auto.sh /usr/bi ...