题目背景

开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道、一辆停在轨道底部的电梯、和电梯内一杆控制电梯升降的巨大手柄。

题目描述

Nescafe 之塔一共有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。

输入输出样例

输入样例#1:

6 3
-1 0 2

输出样例#1:

19

说明

对于30% 的数据,满足1≤N≤ 10; 2≤M≤ 5。

对于100% 的数据,满足1≤N≤1000; 2 ≤ M ≤20;-N < C1 <C2 < …… < CM < N。

样例解释

手柄从第二个槽扳到第三个槽(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 秒。

把电梯处于每层,控制器处于哪个控制槽当做状态编号

把可行状态之间连边

最后把m个终止状态连向同一个源点,即建造一个超级源求最短路即可

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;struct my{int v;int next;int w;
};struct head{int u,w;bool operator <(const head &rhs)const{return w>rhs.w;}
};const int maxn=10000+10;
const int maxm=1e6+10;
const int nil=0x7f7f7f7f;int c[maxn],fa,n,m,adj[maxm],d[maxm];
bool done[maxm];
my bian[2*maxm];priority_queue<head>Q;void myinsert(int u,int v,int w){bian[++fa].v=v;bian[fa].next=adj[u];bian[fa].w=w;adj[u]=fa;
}int id(int x,int y){return (x-1)*m+y;
}void dij(int s){for (int i=1;i<=n*m+1;i++) d[i]=nil;head x;x.u=s;x.w=0;d[s]=0;Q.push(x);while(!Q.empty()){x=Q.top();Q.pop();int u=x.u;if(done[u]) continue;done[u]=true;for (int i=adj[u];i;i=bian[i].next){int v=bian[i].v;int w=bian[i].w;if(d[v]>d[u]+w){d[v]=d[u]+w;x.u=v;x.w=d[v];Q.push(x);}}}
}int main(){int top=0;scanf("%d%d",&n,&m);for (int i=1;i<=m;i++){scanf("%d",&c[i]);if(c[i]==0) top=i;}for (int i=1;i<=n;i++){for (int j=1;j<=m;j++){if(j<m) myinsert(id(i,j),id(i,j+1),1);if(j>1) myinsert(id(i,j),id(i,j-1),1);//位于第i层第j个控制器可以连向另一个控制器if(i+c[j]<=n&&i+c[j]>=1){myinsert(id(i,j),id(i+c[j],j),abs(c[j]*2));//位于第i层第j个控制器,可以把电梯升至i+c[j]层
            }}}for(int i = 1; i <= m; i++)myinsert(id(n, i), n * m + 1, 0);//把m个终止状态连向同一个源点,即建造一个超级源dij(id(1,top));if(d[n*m+1]>=nil) printf("-1");else printf("%d",d[n*m+1]);
return 0;
}

转载于:https://www.cnblogs.com/lmjer/p/9343380.html

tyvj2032(超级源点)相关推荐

  1. 解题报告:POJ - 1062 昂贵的聘礼(最短路、超级源点)

    整理的算法模板合集: ACM模板 AcWing 903. 昂贵的聘礼 [思路] 由于本题只有终点,没有起点,所以我们建一个超级源点S=0S = 0S=0 ,源点与各各点的权值就是他们的价格 如下图所示 ...

  2. [poj 1364]King[差分约束详解(续篇)][超级源点][SPFA][Bellman-Ford]

    题意 有n个数的序列, 下标为[1.. N ], 限制条件为: 下标从 si 到 si+ni 的项求和 < 或 > ki. 一共有m个限制条件. 问是否存在满足条件的序列. 思路 转化为差 ...

  3. D.引水工程 【最小生成树+超级源点】

    D.引水工程 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 18 Solved: 10 [Submit][Status][Web Board] Desc ...

  4. 图论技巧 : 超级源点与超级汇点的建立

    1.什么是超级源点与超级汇点 (1)超级源点跟超级汇点是模拟出来的虚拟点,多用于图中 : <1>同时有多个源点和多个汇点,建立超级源点和超级汇点 <2>同时有多个源点和一个汇点 ...

  5. 《网络流学习笔记04 NYOJ 489 哭泣天使(建边,超级源点和汇点)》

    链接:click here 题意描述: 哭泣天使 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 5 描述 Doctor Who乘着Tardis带着Amy来到了一个星球,一开 ...

  6. 最短路多起点多终点(超级源点)

    我们先来回忆一下spfa判负环的思想: 就是先把所有的点入队列,然后用一个一个点去枚举边去松弛点与点之间的距离,顺便记录一下被松弛点的最短路径所经过的边数,如果发现一个点的最短路径边数大于等于n(n为 ...

  7. BZOJ-1066 蜥蜴 最大流+拆点+超级源超级汇

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2582 Solved: 1272 [Submit][Status] ...

  8. Gym 101845(2018 ACM-ICPC, Universidad Nacional de Colombia Programming Contest)

    Problem A Problem B 分析: 暴力查找,由操作111,我们可以知道原串的第一位可以匹配结果串的每一位,所以O(n)\mathcal{O}(n)O(n)枚举对齐判断就好:由操作222, ...

  9. pku 3422 Kaka's Matrix Travels 最大费用最大流

    http://poj.org/problem?id=3422 /* 题意:给定一个n*n的矩形方格,要求从(1,1)出发,只能往右下角走,(i + 1,j) 或者 (i + n,j)每次走完将格子里面 ...

最新文章

  1. Java必须了解的“递归”与“IO流”!!!
  2. 一秒搭建gitbook
  3. rasa聊天机器人_Rasa-X是持续改进聊天机器人的独特方法
  4. bzoj3143: [Hnoi2013]游走
  5. 凯兑换系统服务器角色,能够在所有局中通用的角色,游走于各个线路,单挑很强的凯...
  6. Beta阶段第四次Scrum Meeting
  7. Dex Loader] Failed to load D:\adt-bundle-windows-x86_64-20190307\sdk\build-tools\28.0.3\lib\dx.jar
  8. wpe手机中文汉化版下载_wpe中文版
  9. java 实现macd算法_macd 的java版本实现 包含测试用例
  10. VB作业之生成随机数
  11. SMAA算法详解 - SMAADetectVerticalCornerPattern
  12. Linux 设备驱动
  13. 多态性(一)——静态多态性
  14. Field *****Service in com.ruoyi.web.slweb.controller.TAcceptController required a bean of type ‘com.
  15. 琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记
  16. python3 中文手册Python 入门指南
  17. csdn怎么让代码变得好看_是什么让游戏变得更好
  18. Neo4j在Windows下的安装,提供下载链接(官网忒慢)
  19. easyx游戏编程:五子棋(C语言游戏开发)
  20. 互联网电商企业应该办理icp许可证还是edi许可证?

热门文章

  1. 想转行前端,前端工程师每天都在做什么?
  2. 服务器端名片识别/ocr识别
  3. python中filepath路径怎么写_python文件路径操作方法总结
  4. 使用Nero软件刻录ISO系统盘
  5. 手把手教你使用ADSP-21569(七)在线调试程序的详细说明(TDM配置:4进12出)
  6. 交叉编译环境中虚拟机ubuntu向开发板传送文件的方法
  7. 【Linux】linux上挂载NFS
  8. Springer 图书推荐 | 边缘计算专题
  9. 一个35+岁的团体在硅谷的创业故事
  10. 未能加载文件或程序集“microsoft.office.interop.excel.version=15.0.0,culture=neutral