洛谷 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;
}
转载于:https://www.cnblogs.com/JYYHH/p/11295390.html
洛谷 P2832 行路难相关推荐
- 洛谷P2832 行路难
题面 思路: 最短路问题.加上疲劳度看似很难,但只要用一个记录疲劳度的数组就好啦,另外还需要记录路径. 代码: #include<iostream> #include<cstdio& ...
- 洛谷:P2832 行路难(堆优化Dijkstra(错解)bfs(正解) + 记录路径)
洛谷:P2832 行路难 写这道题确实是行路难- 此题的最短路约束不只是边权,还有边数(每经过一条边,之后经过的边权值都 +1+1+1 ) 从期望的角度分析,我们肯定是想 尽可能走的路程越短,走得路径 ...
- 洛谷-题解 P2672 【推销员】
独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...
- 洛谷 P1142 轰炸
洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...
- 洛谷 P1387 最大正方形
P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...
- 洛谷P2763 试题库问题
题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...
- 动态规划——洛谷_P1057传球游戏
题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...
- 洛谷P1417 烹调方案
洛谷P1417 烹调方案 如果是一般的01背包的话 选的先后是没关系的 但是这题选的先后是有关系的,因为他的价值是随着时间而变化的, 而你的01背包是做不到先选2再选1的 那么我们就跟国王游戏一样 用 ...
- 记忆优化搜索(简单题)(洛谷P3183 [HAOI2016]食物链 )( P5635 【CSGRound1】天下第一 )
昨天做了蓝桥杯的时候,发现自己对于记忆优化搜索甚是不熟悉,所以今天随便找了几个基础题做做,顺便写下两片题解,顺便用了一下devc++敲的代码,发现没有代码补全真的可以说是灰常难受了... 洛谷P318 ...
最新文章
- 【解决方案】分布式定时任务解决方案
- python【蓝桥杯vip练习题库】BASIC-5查找整数
- mediawiki java_使用MediaWiki 1.16.0实现添加媒体向导
- 信息学奥赛一本通 1056:点和正方形的关系 | OpenJudge NOI 1.4 18
- 计算机专业最低院校门槛,2021年全国各省高考高校录取最低位次排名查询系统...
- word 段显示在页面最下方_最快速地把同一内容插入到Word文档不同页面的相同位置...
- 分布式监控系统开发【day37】:填充表配置项目(三)
- 【sm2算法】基于mbedtls开源库国密算法的使用(二)
- 木纤维(WF)保温材料UKCA认证—EN 13171
- 怎么看服务器硬盘是机械还是固态,怎么辨别机械硬盘和固态硬盘?(附多种方法)...
- 攻防世界web新手区合集
- cdx 快速切换路径
- 信雅达电子影像系统雄踞市场第一
- 计算机考试中粗实线,国开电大 计算机绘图(终结性考试)大作业答案
- 简单的几种排解散列冲突
- go语言 declared and not used
- 3d boxes background
- linux下运行abaqus比win快吗,高性能计算服务器下的Abaqus安装及并行计算
- ricequant量化的基础是什么?
- python转js解释器_python 代码转换 js