【最短路】【spfa】小vijos P1447 Updown
小vijos P1447 Updown
背景
开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘
的是一条直通塔顶的轨道、一辆停在轨道底部的电梯、和电梯内一杆控制电梯升降的巨大手
柄。
faebdc 之塔一共有 N 层,升降梯在每层都有一个停靠点。手柄有 M 个控制槽,第 i
个控制槽旁边标着一个数 Ci, 满足 C1<C2<C3<...<CM。 如果 Ci>0,表示手柄扳动到该槽
时,电梯将上升 Ci 层;如果 Ci<0,表示手柄扳动到该槽时,电梯将下降|Ci| 层;并且一定
存在一个 Ci=0,手柄最初就位于此槽中。注意升降梯只能在 1~N 层间移动,因此扳动到使
升降梯移动到 1 层以下、N 层以上的控制槽是不允许的。
电梯每移动一层,需要花费 2 秒钟时间,而手柄从一个控制槽扳到相邻的槽, 需要花费
1 秒钟时间。探险队员现在在 1 层,并且想尽快到达 N 层,他们想知道从 1 层到 N 层至少
需要多长时间?
输入格式
第一行两个正整数 N、M
第二行 M 个整数 C1、C2...CM
输出格式
输出一个整数表示答案,即至少需要多长时间。若不可能到达输出-1。
样例输入
6 3
-1 0 2
样例输出
19
时间限制
各个测试点1s
注释
样例说明
手柄从第二个槽扳到第三个槽(0 扳到 2),用时 1 秒,电梯上升到 3 层,用时 4 秒。
手柄在第三个槽不动,电梯再上升到 5 层,用时 4 秒。
手柄扳动到第一个槽(2 扳到-1),用时 2 秒,电梯下降到 4 层,用时 2 秒。
手柄扳动到第三个槽(-1 扳倒 2),用时 2 秒,电梯上升到 6 层,用时 4 秒。
总用时为(1+4)+4+(2+2)+(2+4)=19 秒。
数据范围与约定
对于 30% 的数据,满足 1≤N≤10,2<=M<=5。
对于 100% 的数据,满足 1≤N≤1000,2<=M<=20,-N<C1<C2<...<CM<N
显然根据题意,可以dp,但是我们很难转移,所以,我们把所有状态当成点,建边,跑最短路即可。
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
#define M 400001
#define N 25001
queue<int>q;
int n,m,a[],en,v[M],w[M],first[M],next[M],num[][],sta,ans=,dis[N];
bool inq[N];
int Abs(const int &x){return x< ? (-x) : x;}
void AddEdge(const int &U,const int &V,const int &W)
{
v[++en]=V;
w[en]=W;
next[en]=first[U];
first[U]=en;
}
void spfa(const int &s)
{
memset(dis,0x7f,sizeof(dis));
q.push(s); inq[s]=; dis[s]=;
while(!q.empty())
{
int U=q.front();
for(int i=first[U];i;i=next[i])
if(dis[v[i]]>dis[U]+w[i])
{
dis[v[i]]=dis[U]+w[i];
if(!inq[v[i]])
{
inq[v[i]]=;
q.push(v[i]);
}
}
q.pop(); inq[U]=;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
num[i][j]=++en;
if(i==&&a[j]==) sta=en;
} en=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)//单层移动手柄
for(int k=;k<=m;k++)
if(j!=k)
AddEdge(num[i][j],num[i][k],Abs(j-k));
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(a[j]!=&&i+a[j]>=&&i+a[j]<=n)
AddEdge(num[i][j],num[i+a[j]][j],(Abs(a[j])<<));
spfa(sta);
for(int i=;i<=m;i++) ans=min(ans,dis[num[n][i]]);
printf("%d\n",ans>= ? - : ans);
return ;
}
【最短路】【spfa】小vijos P1447 Updown的更多相关文章
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- SPFA 小优化*2
/* bzoj 2763 SPFA小优化 循环队列+SLF 顺面改掉自己之前手打qeueu的坏毛病*/ #include<iostream> #include<cstring> ...
- L - Subway(最短路spfa)
L - Subway(最短路spfa) You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. In ...
- 【wikioi】1269 匈牙利游戏(次短路+spfa)
http://www.wikioi.com/problem/1269/ 噗,想不到.. 次短路就是在松弛的时候做下手脚. 设d1为最短路,d2为次短路 有 d1[v]>d1[u]+w(u, v) ...
- LightOJ 1074 Extended Traffic (最短路spfa+标记负环点)
Extended Traffic 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/O Description Dhaka city ...
- 次短路[SPFA]
Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样, ...
- POJ 3255 Roadblocks (次短路 SPFA )
题目链接 Description Bessie has moved to a small farm and sometimes enjoys returning to visit one of her ...
- 最短路——spfa
适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一 ...
- 图论算法(三) 最短路SPFA算法
我可能要退役了…… 退役之前,写一篇和我一样悲惨的算法:SPFA 最短路算法(二)SPFA算法 Part 1:SPFA算法是什么 其实呢,SPFA算法只是在天朝大陆OIers的称呼,它的正统名字叫做: ...
随机推荐
- mapreduce出现大量task被KILLED_UNCLEAN的3个原因
Request received to kill task 'attempt_201411191723_2827635_r_000009_0' by user ------- Task has bee ...
- 自旋锁、排队自旋锁、MCS锁、CLH锁
转载自:http://coderbee.net/index.php/concurrent/20131115/577 自旋锁(Spin lock) 自旋锁是指当一个线程尝试获取某个锁时,如果该锁已被其他 ...
- maven项目在eclipse tomcat正常运行
转摘自:http://binary.duapp.com/2013/10/1577.html 配置下部署路径即可.
- 如何解决DuplicateFileException: Duplicate files copied in APK问题
问题:有重复的文件存在APK里 解决方案:在Module里的build.gradle中设置忽略此重复文件即可.
- jquery中的get和post、ajax有关返回值的问题描述
一:前言 今天我就要离开公司回学校准备考试,在走之前,我自己做的一个模块测试除了一些小的bug.问题如下 我在往数据库中插入数据,首先要选择一级菜单,接着会更具一级菜单生成一级菜单的子目录,在选择日期 ...
- Node.js 编码转换
Node.js自带的toString()方法不支持gbk,因此中文转换的时候需要加载第三方库,推荐以下两个编码转换库,iconv-lite和encoding. iconv, iconv-l ...
- GridPanel 带头和锁定列共存
该功能还存在很多BUG,仅供参考 Ext.net.ResourceMgr.load([{ url: _HOST + "Js/OverwriteExtjs/LockingHeaderGroup ...
- 【目录】Python学习笔记
目录:Python学习笔记 目标:坚持每天学习,每周一篇博文 1. Python学习笔记 - day1 - 概述及安装 2.Python学习笔记 - day2 - PyCharm的基本使用 3.Pyt ...
- 自定义UINavigationController push和pop动画
http://segmentfault.com/q/1010000000143983 默认的UINavigationController push和pop的默认动画都是左右滑动推出,我的应用要求这种界 ...
- android usb adb流程[转]
android adb 概述 android adb的代码分为两部分: kernel层的代码在如下路径: drivers/usb/gadget/f_adb.c drivers/usb/gadget/a ...