SPFA+寻路(行路难,洛谷2832)
注意:本博客代码被黑心数据Hack,有空补回来
啊啊啊这道难题总算是做出来了,首先是帅比浮云的题解发出来一下:http://www.cnblogs.com/fuyun-boy/p/5922742.html
原题目地址:https://www.luogu.org/problem/show?pid=2832
题目背景
小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
7
1 3 5
说明
n<=10000, m<=200000
数据保证没有多条最短路径
【题解】
这道题就是最短路的变体,不过从起点到终点每多走一条边就要多加一点权值。
比如说原来的权值是6+7+9+3+5,之后的权值就是6+(7+1)+(9+2)+(3+3)+(5+4)了。
下面的这个是我写的代码。我的解决方法就是加上两个数组,一个是r,一个是tr。
d数组还是spfa一如既往的d数组,是除去这道题额外的条件的数组。
tr数组是补充数组(废话),d[i]+tr[i]表示从起点走到这个点的最小花费。
r[i]是按照从起点走到第i个节点花费d[i]+tr[i]的最短路径时,最后一次的增加值。
比如说上面的那个6+(7+1)+(9+2)+(3+3)+(5+4),表示一条路径,则这条路径终点节点的r数组的值是4。
因为走到这里最后一次加上的数字是4。
pre数组不说了,帅比浮云说了很清楚。。。
#include <cstdio>
#include <cstring>
#include <queue>
#define mp make_pair
using namespace std;
int n,m,h;
struct edge
{
int v,w;
edge*next;
};
edge* link[10001];
int d[10001],r[10001],tr[10001],pre[10001];
bool v[10001];
void add(int u,int v,int w)
{
edge* p=new edge;
p->v=v;
p->w=w;
p->next=link[u];
link[u]=p;
}
void del(edge* p)
{
if(p!=NULL)
{
del(p->next);
delete p;
}
}
void spfa()
{
queue<int>q;
memset(d,0x3f,sizeof(d));
d[1]=0;
q.push(1);
v[1]=true;
while(!q.empty())
{
int x=q.front();
q.pop();
v[x]=false;
for(edge* p=link[x];p!=0;p=p->next)
{
if(d[x]+tr[x]+p->w+r[x]<d[p->v]+tr[p->v])
{
d[p->v]=d[x]+p->w;
tr[p->v]=tr[x]+r[x];
r[p->v]=r[x]+1;
pre[p->v]=x;
if(v[p->v]==false)
{
v[p->v]=true;
q.push(p->v);
}
}
}
}
}
void print(int n)
{
if(n!=1)
print(pre[n]);
printf("%d ",n);
}
int main()
{
int CO2,H2O,H2CO3;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&CO2,&H2O,&H2CO3);
add(CO2,H2O,H2CO3);
}
spfa();
printf("%d\n",d[n]+tr[n]);
print(n);
for(int i=1;i<=n;i++)
del(link[i]);
return 0;
}
祝各位NOIP2016 RP++ SCORE++
SPFA+寻路(行路难,洛谷2832)的更多相关文章
- spfa模板(洛谷3371)
洛谷P3371 //spfa:求s到各点的最短路,可含负权边 #include <cstdio> using namespace std; ,max_m=,inf=; struct ety ...
- 【模板】负环(SPFA/Bellman-Ford)/洛谷P3385
题目链接 https://www.luogu.com.cn/problem/P3385 题目大意 给定一个 \(n\) 个点有向点权图,求是否存在从 \(1\) 点出发能到达的负环. 题目解析 \(S ...
- 洛谷P2832 行路难 分析+题解代码【玄学最短路】
洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...
- NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序
原文链接https://www.cnblogs.com/zhouzhendong/p/9258043.html 题目传送门 - 洛谷P3953 题目传送门 - Vijos P2030 题意 给定一个有 ...
- 洛谷P1342 请柬(SPFA)
To 洛谷.1342 请柬 题目描述 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣传剧院,尤其是古色古香的喜剧片.他们已经打印请帖和所有必要的信息和计 ...
- 洛谷P1144 最短路计数(SPFA)
To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M ...
- 洛谷.4015.运输问题(SPFA费用流)
题目链接 嗯..水题 洛谷这网络流二十四题的难度评价真神奇.. #include <queue> #include <cstdio> #include <cctype&g ...
- 【题解】洛谷P1073 [NOIP2009TG] 最优贸易(SPFA+分层图)
次元传送门:洛谷P1073 思路 一开始看题目嗅出了强连通分量的气息 但是嫌长没打 听机房做过的dalao说可以用分层图 从来没用过 就参考题解了解一下 因为每个城市可以走好几次 所以说我们可以在图上 ...
- 洛谷P1186 玛丽卡 spfa+删边
洛谷P1186 玛丽卡http://blog.csdn.net/huihao123456/article/details/73414139题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. ...
随机推荐
- linux dns 配置
今天线上出现一个bug,图片上传失败. 经过排查发现,上传图片接口调用失败,ping 域名提示 unknow host,ping IP正常. 猜想可能是dns的问题.解决过程如下: /etc 下没有 ...
- Android IOS WebRTC 音视频开发总结(二五)-- webrtc优秀资源汇总
本文主要整理一些webrtc相关资料供学习(会持续更新),转载请说明出处,文章来自博客园RTC.Blacker,欢迎关注微信公众号:blackerteam ---------------------- ...
- Dalvik系列02 - 指令格式
简介 该文档描述了Dalvik 可执行文件和Dalvik 字节码的指令格式. 按照位的描述 格式描述表(见下文)的第一列表示个格式的位结构,它由一个或者多个由空格分开的“指令单元”构成,每个指令单元的 ...
- java 分布式锁方案
第一步,自身的业务场景: 在我日常做的项目中,目前涉及了以下这些业务场景: 场景一: 比如分配任务场景.在这个场景中,由于是公司的业务后台系统,主要是用于审核人员的审核工作,并发量并不是很高,而且任务 ...
- linux基础命令之:vi模式下查找和替换
一.查找 查找命令 /pattern<Enter> :向下查找pattern匹配字符串 ?pattern<Enter>:向上查找pattern匹配字符串 使用了查找命令之后,使 ...
- 编程模式之装饰模式(Decorator)
装饰模式由四个角色组成:抽象组件角色,抽象装饰者角色,具体组件角色,具体装饰者角色. 抽象组件角色:给出一个抽象接口,以规范"准备接受附加功能"的对象. 抽象装饰者角色:持有一个组 ...
- Linux常用目录及文件
1./etc/sysconfig/network 操作相关:hostname设置 2./etc/sysconfig/network-scripts/ifcfg-ethX(X为0.1等编号,一般为0) ...
- {POJ}{3897}{Maze Stretching}{二分答案+BFS}
题意:给定迷宫,可以更改高度比,问如何使最短路等于输入数据. 思路:由于是单调的,可以用二分答案,然后BFS验证.这里用优先队列,每次压入也要进行检查(dis大小)防止数据过多,A*也可以.好久不写图 ...
- javascript-binarySearch
前提: 数组已排序,且为正整数数组. function brnarySearch(arg, arr) { var right = arr.length - 1; var left = 0; while ...
- 16.2.2 Space Needed for keys
myisam表使用btree索引,可以粗略计算出索引文件的大小,使用(key_length+4)/0.67,全部key的总和,全部key被排序顺序插入和表没有被任何压缩的时候,这是最坏的情况 stri ...