题意:

  有n<6部电梯,给出每部电梯可以停的一些特定的楼层,要求从0层到达第k层出来,每次换乘需要60秒,每部电梯经过每层所耗时不同,具体按 层数*电梯速度 来算。问经过多少秒到达k层(k可以为0)?

思路:

  dijkstra再加一些特殊的处理就行了。首先要考虑,如何建图:

(1)每层作为一个点。但是特定路径可以有多种权,比如从2->5可以坐1号电梯10s,但是坐2号只需要5s,所以有重边。

(2)k=0时,不耗时间。

(3)有多种路径可达同一楼层且权值相同,那么从本楼层到另一楼层有多种选择,有时可以不换电梯,有时需要换。比如到达5楼的有2条路径,权都是5,但是是两部不同的电梯1和2,此时有其他电梯可以从5到7楼,其中有一部仍是电梯1,如果坐电梯1则不需要换乘时间,坐其他电梯就要了。所以要记录到某个点权值相等的电梯号。

  1. #include <bits/stdc++.h>
  2. #define LL long long
  3. #define pii pair<int,int>
  4. #define INF 0x7f7f7f7f
  5. using namespace std;
  6. const int N=;
  7. int take[];
  8. char s[];
  9. vector<int> lift[], vect[];
  10. int cost[N], vis[N];
  11. struct node
  12. {
  13. int from, to, lift, cost;
  14. node(){};
  15. node(int from,int to,int lift,int cost):from(from),to(to),lift(lift),cost(cost){};
  16. }edge[];
  17. int edge_cnt;
  18.  
  19. void add_node(int from,int to,int lift,int cost)
  20. {
  21. edge[edge_cnt]=node(from,to,lift,cost);
  22. vect[from].push_back(edge_cnt++);
  23. }
  24.  
  25. void build_graph(int n) //重新建图
  26. {
  27. for(int i=; i<n; i++)
  28. {
  29. for(int j=; j<lift[i].size(); j++)
  30. {
  31. for(int t=j+; t<lift[i].size(); t++)
  32. {
  33. int a=lift[i][j];
  34. int b=lift[i][t];
  35. add_node(a,b,i,(b-a)*take[i]);
  36. add_node(b,a,i,(b-a)*take[i]);
  37. }
  38. }
  39. }
  40. }
  41.  
  42. int dijkstra(int s,int e)
  43. {
  44. vector<int> flo[];
  45. memset(cost,0x7f,sizeof(cost));
  46. memset(vis,,sizeof(vis) );
  47.  
  48. priority_queue<pii,vector<pii>,greater<pii> > que;
  49. que.push( make_pair(,s));
  50. cost[s]=;
  51. while(!que.empty())
  52. {
  53. int x=que.top().second;que.pop();
  54. if(vis[x]) continue;
  55.  
  56. vis[x]=;
  57. for(int i=; i<vect[x].size(); i++)
  58. {
  59. node e=edge[vect[x][i]];
  60. int ext=;
  61.  
  62. for(int j=; j<flo[e.from].size(); j++) //如果有一个匹配,就不用额外时间
  63. if( flo[e.from][j]==e.lift ) ext=;
  64.  
  65. if(cost[e.to]>=cost[e.from]+ext+e.cost )
  66. {
  67. if( cost[e.to]>cost[e.from]+ext+e.cost ) flo[e.to].clear();
  68. flo[e.to].push_back(e.lift);
  69.  
  70. cost[e.to]= cost[e.from] +ext +e.cost;
  71. que.push( make_pair(cost[e.to], e.to) );
  72. }
  73. }
  74. }
  75. return cost[e];
  76. }
  77.  
  78. int main()
  79. {
  80. freopen("input.txt", "r", stdin);
  81. int n, k;
  82. while(~scanf("%d%d",&n,&k))
  83. {
  84. for(int i=; i<n; i++) lift[i].clear();
  85. for(int i=; i<; i++) vect[i].clear();
  86. memset(s,,sizeof(s));
  87.  
  88. for(int i=; i<n; i++) scanf("%d",&take[i]);
  89. getchar();
  90. for(int i=; i<n; i++)
  91. {
  92. lift[i].clear();
  93. gets(s);
  94. int p=;
  95. while(s[p]!='\0')
  96. {
  97. if(s[p]==' ') p++;
  98. int tmp=;
  99. while(s[p]!=' ' &&s[p]!='\0' ) tmp=tmp*+(s[p++]-'');
  100. lift[i].push_back(tmp);
  101. }
  102. }
  103. build_graph(n);
  104. int ans=dijkstra(,k);
  105. if(!k) puts("");
  106. else if(ans==INF) puts("IMPOSSIBLE");
  107. else printf("%d\n", ans- ) ;
  108. }
  109. return ;
  110. }

AC代码

UVA 10801 Lift Hopping 电梯换乘(最短路,变形)的更多相关文章

  1. UVa 10801 - Lift Hopping(dijkstra最短路)

    根据题意,以每一层楼为顶点,每个电梯可以到达的两层楼之间的秒数为每一条边的权值,以此构建一个无向图.然后利用dijkstra求出最短的时间,注意每次换乘电梯需要等待60s(因为同一个电梯上的楼层是相互 ...

  2. uva 10801 - Lift Hopping(最短路Dijkstra)

    /* 题目大意: 就是一幢大厦中有0-99的楼层, 然后有1-5个电梯!每个电梯有一定的上升或下降速度和楼层的停止的位置! 问从第0层楼到第k层最少经过多长时间到达! 思路:明显的Dijkstra , ...

  3. UVA 10801 Lift Hopping 最短路

    2种方式直接代码就可以了.注意首次不需要60S的转换 #include <map> #include <set> #include <list> #include ...

  4. UVa 10801 Lift Hopping (Dijkstra)

    题意:有一栋100层的大楼(标号为0~99),里面有n个电梯(不超过5个),以及要到达的层数(aid),然后是每个电梯走一层所需的时间, 再n行就是对应每个电梯可以到达的层数,数量不定.然后每装换一次 ...

  5. UVa 10801 Lift Hopping【floyd 】

    题意:给出n个电梯,每个电梯的运行时间,每个电梯只能在相应的楼层停靠,而且没有楼梯,再给出想去的楼层,问从0层能否到达想去的楼层,求到达的最短时间 建图还是没有建出来--- 因为n<100,可以 ...

  6. UVa 10801 Lift Hopping / floyd

    乘电梯 求到目标层的最短时间 有n个电梯 换一个电梯乘需要额外60秒 所以建图时每个电梯自己能到的层数先把时间算好 这是不需要60秒的 然后做floyd时 如果松弛 肯定是要换电梯 所以要加60秒 # ...

  7. UVA 10801 Lift Hopping

    算是一道需要动脑筋的最短路问题了,关键在于建图部分,对于n个电梯中每一个都要经过cnt个楼层,a[0],a[1],a[2],a[3],a[4],......a[cnt-1],那么对于任意两个楼层a[j ...

  8. UVA 10801 多线程最短路

    题意:一栋摩天大楼从0层到K层,有N部电梯,每个电梯都有自己的运行速度,此外,对于某个电梯来说,并不是每一层都会停,允许在某一层进行电梯换乘,每次换乘固定消耗60秒,最终求从0层去K层的最短时间,如果 ...

  9. UVA 11248 - Frequency Hopping(网络流量)

    UVA 11248 - Frequency Hopping 题目链接 题意:给定一个网络,如今须要从1到N运输流量C,问是否可能,假设可能输出可能,假设不可能,再问能否通过扩大一条边的容量使得可能,假 ...

随机推荐

  1. 在线最优化求解(Online Optimization)之二:截断梯度法(TG)

    在线最优化求解(Online Optimization)之二:截断梯度法(TG) 在预备篇中我们做了一些热身,并且介绍了L1正则化在Online模式下也不能产生较好的稀疏性,而稀疏性对于高维特征向量以 ...

  2. BT5之Metasploit[MSF]连接postgresql数据库

    1,先查看postgresql的端口,默认是自动开启的,端口7337 .   root@bt:~# netstat -tnpl |grep postgres tcp        0      0 1 ...

  3. Eclipse下PHP开发 插件安装

    PHPeclipse是什么? PHPeclipse是Eclipse的一个插件,它为php开发人员提供了一个集成的开发环境.Eclipse官方下载地址:http://www.eclipse.org/ P ...

  4. ajax post 跨域

    H5页面永远无法避开跨域问题-- php中, header('Access-Control-Allow-Origin:*'); 搞定. 兼容性先不管了. 来自为知笔记(Wiz)

  5. 官方 Animator 例子解析 Animator.MatchTarget

    一.官方的解释 Animator.MatchTargetSwitch to Manual ); Parameters matchPosition The position we want the bo ...

  6. Unity3D 优化相关

    抛砖引玉: http://www.luzexi.com/unity3d%E4%BC%98%E5%8C%96%E4%B9%8B%E8%B7%AF/ 关于图片 一.Unity3D自身会把导入的图片进行压缩 ...

  7. Oracle RAC 常用维护工具和命令

    Oracle RAC 常用维护工具和命令 分类: Oracle Basic Knowledge Oracle RAC2010-03-09 01:02 13987人阅读 评论(6) 收藏 举报 orac ...

  8. UNDERSTANDING CALLBACK FUNCTIONS IN JAVASCRIPT

    转自: http://recurial.com/programming/understanding-callback-functions-in-javascript/ Callback functio ...

  9. javascript中创建插入元素

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  10. lintcode 中等题:N Queens II N皇后问题 II

    题目: N皇后问题 II 根据n皇后问题,现在返回n皇后不同的解决方案的数量而不是具体的放置布局. 样例 比如n=4,存在2种解决方案 解题: 和上一题差不多,这里只是求数量,这个题目定义全局变量,递 ...