UVA 10801 Dij最短路(改模板)

题意:有n个电梯,目的地是第K层(起点是第0层),给出每个电梯的速度,以及每个电梯能到达的层数,如果中途需要换电梯的话,时间需要+60,求到达目的地的最短时间;

思路:Dij求最短路。如果是另一条路比较短的话,相当于乘别的电梯,也就是再+60,自己不可能和自己比,即d[e.v] 和 d[e.u] + d + 60比较即可;

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <string>
  5 #include <sstream>
  6 #include <queue>
  7 #include <vector>
  8 #define repu(i,a,b) for(int i=a;i<b;i++)
  9 using namespace std;
 10 string s;
 11 #define N 110
 12 int v[N],t[N];
 13 const int maxn=2200;
 14 const int INF=0x3f3f3f3f;
 15 int rode[maxn];
 16 int st = 0,ed,k;
 17
 18 struct Edge
 19 {
 20     int u, v,d;
 21     Edge(int u, int v, int d):u(u), v(v), d(d) {}
 22 };
 23
 24 struct qnode
 25 {
 26     int u;
 27     int d;
 28     qnode(int u, int d):u(u), d(d) {}
 29     bool operator < (const qnode a)const
 30     {
 31         return d > a.d;
 32     }
 33 };
 34
 35 struct Dijkstra
 36 {
 37     int n;
 38     vector<int> G[maxn];
 39     vector<Edge> edge;
 40     int d[maxn];
 41     bool vis[maxn];
 42     void init(int n)
 43     {
 44         this->n=n;
 45         for(int i=0; i<=n; i++)
 46         {
 47             G[i].clear();
 48             vis[i]=0;
 49             d[i]=INF;
 50         }
 51         edge.clear();
 52     }
 53     void AddEdge(int u, int v,  int d)
 54     {
 55         G[u].push_back(edge.size());
 56         edge.push_back(Edge(u, v, d));
 57     }
 58     int dijkstra(int k)
 59     {
 60         memset(vis, 0, sizeof vis);
 61         priority_queue<qnode> q;
 62         d[0]=0;
 63         q.push(qnode(0, 0));
 64         while(!q.empty())
 65         {
 66             qnode x = q.top();
 67             q.pop();
 68             if(vis[x.u])
 69                 continue ;
 70             vis[x.u]=true;
 71             if(x.u == k)
 72                 return d[k] - 60;
 73             if(d[x.u] == INF) return -1;
 74             for(int i=0; i<G[x.u].size(); i++)
 75             {
 76                 Edge e=edge[G[x.u][i]];
 77                 int tep = d[e.u] + e.d + 60;
 78                 if(d[e.v] > tep)
 79                 {
 80                     d[e.v] = tep;
 81                     q.push(qnode(e.v, d[e.v]));
 82                 }
 83             }
 84         }
 85         return -1;
 86     }
 87 } dij;
 88
 89 int main()
 90 {
 91     int n,k;
 92     while(~scanf("%d%d",&n,&k))
 93     {
 94         int maxn = 0;
 95         memset(v,0,sizeof(v));
 96         st = 0;
 97         ed = k;
 98         repu(i,0,n)
 99         scanf("%d",&v[i]);
100         int m=0;
101         getchar();
102         dij.init(N);
103         repu(i,0,n)
104         {
105             getline(cin,s);
106             int l = s.length(),last = 0;
107             m = 0;
108             memset(t,0,sizeof(t));
109             repu(j,0,l)
110             {
111                 if(s[j] == ‘ ‘)
112                 {
113                     string c = s.substr(last,j-last);
114                     last = j;
115                     stringstream ss1(c);
116                     ss1 >> t[m];
117                     m++;
118                 }
119             }
120             string c = s.substr(last,l-last);
121             stringstream ss1(c);
122             ss1 >> t[m];
123             m++;
124
125 //            repu(j,0,m)
126 //            cout<<t[j]<<" ";
127 //            cout<<endl;
128
129             repu(j,0,m)
130             repu(p,j+1,m)
131             {
132                 dij.AddEdge(t[j], t[p], (t[p]-t[j])*v[i]);
133                 dij.AddEdge(t[p], t[j], (t[p]-t[j])*v[i]);
134             }
135         }
136         if(k == 0)
137         {
138             printf("0\n");
139             continue;
140         }
141         int ans = dij.dijkstra(ed);
142         if(ans == -1)
143             printf("IMPOSSIBLE\n");
144         else
145             printf("%d\n",ans);
146     }
147     return 0;
148 }

时间: 2024-10-14 13:33:07

UVA 10801 Dij最短路(改模板)的相关文章

uva 10801(最短路)

题目大意: 有一层不超过100层的大楼, 有n个电梯,它们的速度都不同. 而且每个电梯只能到达指定的那些楼层,而且它们都有各自的速度(即上升一层或下降一层所用的时间). 如果一个人在某层走出电梯,要换一个电梯乘,那么他要等60秒(不管要等的是那个电梯,即使是刚刚出来的那个电梯也要等60秒).在0层搭电梯出发时不需要等待.一个人从0层开始,目的地是k层, 现在要搭这些电梯,问最少需多少时间. #include <cstdio> #include <iostream> #include

uva 10801 - Lift Hopping(最短路Dijkstra)

1 /* 2 题目大意: 3 就是一幢大厦中有0-99的楼层, 然后有1-5个电梯!每个电梯有一定的上升或下降速度和楼层的停止的位置! 4 问从第0层楼到第k层最少经过多长时间到达! 5 6 思路:明显的Dijkstra ,在建图的时候u->v可能有多个电梯到达,取时间最少的当作路径的权值! 7 如果我们发现 d[i] > d[j] + map[j][i] + 60, 那么说明从第0层到达第 i 层的时间大于从第j层 8 转移到其他电梯然后到达第 i 层的时间,那么就更新d[i]的值! 9 1

训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)

layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalog: true mathjax: true tags: - 最短路 - Dijkstra - 图论 - 训练指南 Airport Express UVA - 11374 题意 机场快线有经济线和商业线,现在分别给出经济线和商业线的的路线,现在只能坐一站商业线,其他坐经济线,问从起点到终点的最短用时是多少,还有

zoj 1655 单源最短路 改为比例+最长路

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=655 没有理解清题意就硬套模板,所以WA了好几次, 解析看我的另一篇http://blog.csdn.net/u011026968/article/details/35579035 贴代码 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #de

训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环)

layout: post title: 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环) author: "luowentaoaa" catalog: true mathjax: true tags: - 最短路 - 基础DP - BellmanFord - 图论 - 训练指南 Going in Cycle!! UVA - 11090 题意 就最小的环的平均权值 题解 分枚举平均值mid,只需判断是否存在平均值小于mid的回路,即判断是否有sum(wi)&

训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束)

layout: post title: 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束) author: "luowentaoaa" catalog: true mathjax: true tags: - 最短路 - BellmanFord - 图论 - 训练指南 - 差分约束 Halum UVA - 11478 题意 带权有向图,每个点都可以有如下操作:令从ta出发的每一条边增加d,终止于ta的每一条边减小d 最后让所有边权的最小值非负且尽量大 题

poj3463 Sightseeing --- dij最短路和次短路

最短路好题啊. 题目给定起点和终点,要求最短路和次短路(要求次短路只比最短路大1)的道路数量. 重点在于次短路如何处理是最高效的呢 这就要求对dij算法路径更新的理解了. 我们用一个数组记录最短路,一个数组记录次短路. 每次对当前最短边,先更新最短路,更新不了最短路再更新次短路. 每条边处理两次,这样就可以在2n×n的复杂度内求得最短路和次短路了. #include<cstdio> #include<cstring> #include<queue> #include&l

[UVA 10801]Lift Hopping[Dijkstra][建图]

题目链接:[UVA 10801]Lift Hopping[Dijkstra][建图] 题意分析: 从0层开始,一共有n台电梯供你到达目的地k层.每台电梯往上走一层都要消耗t[i]的时间,并且电梯只能在特定的楼层停下,换乘电梯要花费60s的时间,而且呢,你不能用楼梯上楼,只能搭电梯....(hentai!)问:最快到达楼层k的时间是多少?不能到达就输出-1. 解题思路: 这题技巧就是体现在建图上,图建好了,用dijkstra跑一遍就行了. 具体建图就是用mp[i][j]代表从楼层i到楼层j的最小距

UVA 10801 Lift Hopping Floyd

题目链接:UVA - 10801 题意描述:有n个电梯,给出每个电梯可以到达的楼层位置和电梯上升或下降一层楼的时间,另外在同一层楼换乘不同的电梯需要等待一分钟,问从楼层位置0(即地面)到第k层楼需要的最短时间是多少. 算法分析:由于n很小(n<100),所有可以用Floyd算法搞之.注意换乘电梯时需要加上那60秒即可了. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include&l