洛谷P2832 行路难 分析+题解代码【玄学最短路】
洛谷P2832 行路难 分析+题解代码【玄学最短路】
题目背景:
小X来到了山区,领略山林之乐。在他乐以忘忧之时,他突然发现,开学迫在眉睫
题目描述:
山区有n座山。山之间有m条羊肠小道,每条连接两座山,只能单向通过,并会耗费小X一定时间。
小X现在在1号山,他的目的是n号山,因为那里有火车站。
然而小X的体力是有限的。他每通过一条羊肠小道,就会变得更疲劳,导致他通过任意一条羊肠小道的时间都增加1。
输入格式:
第一行两个数,n,m
第2行到第m+1行,每行3个数A,B,C,表示A、B之间有一条羊肠小道,可以让小X花费C的时间从A移动到B
输出格式:
两行 第一行一个数T,表示小X需要的最短时间
第二行若干个数,用空格隔开,表示小X的移动路线
例:1 4 2 5表示:小X从1号山开始,移动到4号山,再到2号山,最后到5号山。
输入样例:
5 8
2 4 2
5 2 1
1 2 1
4 3 2
1 3 3
4 5 2
1 5 8
3 5 3
输出样例:
5 8
2 4 2
5 2 1
1 2 1
4 3 2
1 3 3
4 5 2
1 5 8
3 5 3
算法分析:
很明显这是一道最短路(这不是废话嘛)
不过这道题引入了一个疲劳度
乍一看似乎挺难
但其实只要在更新最短路的时候
记录当前被更新最短路的节点i之前已经走过了几节点
即我们以num[v]表示v之前已经走过了几个节点
num[v]=num[u]+1;
u为能使到达v的最短路更新的上一个中介点
所以我们只要在下一次以v为中介点判断是否能更新最短路时加上num[v]即可
其余就只剩SPFA的模板了
废话不多说,呈上蒟蒻代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
int n,m;
struct node
{
int v;
int dis;
};
vector<node> map[1000010];
int d[1000010];
int num[1000010];//记录疲劳值的数组,初始全部为0
bool inq [1000010];
int pre[1000010];//记录最短路径
void print(int u)
{
if(pre[u]==u)
{
cout<<u<<" ";
return ;
}
print(pre[u]);
cout<<u<<" ";
}
void SPFA()
{
for(int i=1;i<=n;i++)
pre[i]=i;
memset(d,127,sizeof(d));
queue<int> q;
q.push(1);
inq[1]=true;
d[1]=0;
while(!q.empty())
{
int u=q.front();
inq[u]=false;
q.pop();
for(int j=0;j<map[u].size();j++)
{
int v=map[u][j].v;
int dis=map[u][j].dis;
if(d[u]+dis+num[u]<d[v])
{
d[v]=d[u]+dis+num[u];
pre[v]=u;
num[v]=num[u]+1;//**高亮**这里更新num[v]的疲劳值
if(!inq[v])
{
q.push(v);
inq[v]=true;
}
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int s,t,dis;
cin>>s>>t>>dis;
map[s].push_back( (node) {t,dis});
}
SPFA();
cout<<d[n]<<endl;
print(n);
return 0;
}
其实就是在SPFA模板里多加了一行。。。
妥妥的 “提高+/省选-” 玄学最短路
洛谷P2832 行路难 分析+题解代码【玄学最短路】的更多相关文章
- 洛谷 P2832 行路难
题面 这个最短路有点special,会有疲劳度的加成效应,这个时候应该怎么办呢? 难就难在,如果走一条路比另一条路长,但是用的边少,那么这条路并不一定就更差. 我们要是能解决这个问题,就可以做出本题. ...
- 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication【最小割】分析+题解代码
洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication[最小割]分析+题解代码 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流. ...
- 洛谷 P2194 HXY烧情侣【Tarjan缩点】 分析+题解代码
洛谷 P2194 HXY烧情侣[Tarjan缩点] 分析+题解代码 题目描述: 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里 ...
- 洛谷P1783 海滩防御 分析+题解代码
洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...
- 洛谷P1854 花店橱窗布置 分析+题解代码
洛谷P1854 花店橱窗布置 分析+题解代码 蒟蒻的第一道提高+/省选-,纪念一下. 题目描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定 ...
- 【洛谷P3960】列队题解
[洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...
- 洛谷P1577 切绳子题解
洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
随机推荐
- mac通过自带的ssh连接Linux服务器并上传解压文件
需求: 1:mac连接linux服务器 2:将mac上的文件上传到linux服务器指定位置 3:解压文件 mac上使用命令,推荐使用 iterm2 .当然,也可以使用mac自带的终端工具. 操作过程: ...
- 有经验JAVA程序员如何提升自己?
作为一个具有一到五年开发经验程序员,需要学习内容很多: JVM/分布式/高并发/性能优化/Spring MVC/Spring Boot/Spring Cloud/MyBatis/Netty源码分析等等 ...
- 为什么要进行URL编码
我们都知道Http协议中参数的传输是"key=value"这种简直对形式的,如果要传多个参数就需要用“&”符号对键值对进行分割.如"?name1=value1&a ...
- Navicat查询结果不能修改的原因
问题: 开发中常使用Navicat查询数据库,并修改数据库中的值.今天发现查询结果为只读,不能修改.一般连表查不能修改我是知道的,但是单表查居然不能修改. 解决方法: 查了下,有说表是只读,也有说是权 ...
- Linux tar 解压的时候报错
报错如下: # tar zxvf php-7.1.6.tar.gz gzip: stdin: not in gzip format tar: Child returned status 1 tar: ...
- awk 的 pattern(模式)
我们知道, awk程序由一系列 pattern 以及与之对应的 action 组成的 rule 组成,rule之间用";"分号隔开, 一条输入记录与 pattern 匹配则执行与之 ...
- jenkins安装配置[二]
标签(linux): jenkins 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 安装依赖,如果本机已有java环境可跳过 yum install java- ...
- TCP/IP详解 卷1 第二十一章 TCP的超时与重传
21.1 引言 可靠性的保证之一就是超时重传 前面两个超时重传的例子 1) ICMP端口不能到达时,TFTP客户使用UDP实现了一个简单的超时和重传机制,假定5s是一个适当是时间间隔,并每隔5s进行 ...
- [squid] kid1| ERROR: No forward-proxy ports configured.
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- 不依赖jstack的java 线程dump和死锁检查工具
java线程dump可以使用jdk的命令"jstack pid"完成,死锁检查可以用jconsole查看到.这两个工具是java调试的常用方法. 我遇到的问题是:在sles11s ...