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
10 */
11 #include<iostream>
12 #include<cmath>
13 #include<cstring>
14 #include<cstdio>
15 #include<algorithm>
16
17 using namespace std;
18 const int INF = 0x3f3f3f3f;
19 int map[105][105];
20 int d[105];
21 int t[5];
22 int lift[105];
23 int vis[105];
24 int n, k;
25
26 void addEdge(int a, int b, int tt){
27     int dist=abs(a-b)*tt;
28     if(map[a][b]>dist)
29        map[a][b]=map[b][a]=dist;
30 }
31
32 void Dijkstra(){
33     int root=0, p;
34     memset(vis, 0, sizeof(vis));
35     vis[0]=1;
36     for(int i=1; i<=99; ++i){
37         int minLen=INF;
38         for(int j=1; j<=99; ++j){
39            if(!vis[j] && d[j] > d[root]+map[root][j]+60)
40               d[j] = d[root]+map[root][j]+60;
41            if(!vis[j] && minLen>d[j]){
42               minLen=d[j];
43               p=j;
44            }
45         }
46         if(minLen==INF)
47            return ;
48         root=p;
49         vis[root]=1;
50     }
51 }
52
53 int main(){
54    while(scanf("%d%d", &n, &k)!=EOF){
55           memset(map, 0x3f, sizeof(map));
56           memset(d, 0x3f, sizeof(d));
57           d[0]=0;
58        for(int i=1; i<=n; ++i)
59           scanf("%d", &t[i]);
60        char ch;
61
62        for(int i=1; i<=n; ++i){
63            int cnt=0;
64            while(1){
65               scanf("%d%c", &lift[cnt++], &ch);
66               for(int j=0; j<cnt-1; ++j)
67                   addEdge(lift[cnt-1], lift[j], t[i]);
68
69               if(ch==‘\n‘)
70                  break;
71            }
72        }
73
74        Dijkstra();
75
76        if(k==0)
77           printf("0\n");
78        else if(d[k]!=INF)
79           printf("%d\n", d[k]-60);
80        else printf("IMPOSSIBLE\n");
81    }
82    return 0;
83 }

uva 10801 - Lift Hopping(最短路Dijkstra),布布扣,bubuko.com

时间: 2024-10-05 04:58:30

uva 10801 - Lift Hopping(最短路Dijkstra)的相关文章

UVA 10801 Lift Hopping 最短路

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

[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 (最短路)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1742 Problem ? Lift Hopping Time Limit: 1 second Ted the bellhop: "I'm coming up and if there isn't a dead body by the time I get there, I'll m

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

UVA 10801 Lift Hopping 电梯换乘(最短路,变形)

题意:有n<6部电梯,给出每部电梯可以停的一些特定的楼层,要求从0层到达第k层出来,每次换乘需要60秒,每部电梯经过每层所耗时不同,具体按 层数*电梯速度 来算.问经过多少秒到达k层(k可以为0)? 思路:dijkstra再加一些特殊的处理就行了.首先要考虑,如何建图: (1)每层作为一个点.但是特定路径可以有多种权,比如从2->5可以坐1号电梯10s,但是坐2号只需要5s,所以有重边. (2)k=0时,不耗时间. (3)有多种路径可达同一楼层且权值相同,那么从本楼层到另一楼层有多种选择,有时

UVa 10801 - Lift Hopping

根据题意,以每一层楼为顶点,每个电梯可以到达的两层楼之间的秒数为每一条边的权值,以此构建一个无向图.然后利用dijkstra求出最短的时间,注意每次换乘电梯需要等待60s(因为同一个电梯上的楼层是相互可达的,所以我们只有通过另外一个电梯找到了更小的搭乘时间时候我们才会执行松弛操作),因此每转一个定点需要加60s时间(注意初始定点不需要60s的等待). #include <bits/stdc++.h> using namespace std; const int INF=0x3f3f3f3f;

UVa 10801 Lift Hopping【floyd 】

题意:给出n个电梯,每个电梯的运行时间,每个电梯只能在相应的楼层停靠,而且没有楼梯,再给出想去的楼层,问从0层能否到达想去的楼层,求到达的最短时间 建图还是没有建出来--- 因为n<100,可以用floyd 考虑到d[i][j]=min(d[i][j],d[i][k]+d[k][j]) d[i][k]+d[k][j],表示从第i层到达了第k层,又从第k层到达了第j层,说明在  k 层的时候换乘了电梯,需要加一个60 然后就是输入过程中,一直维护d[i][j]的最小值,更新的时候往上往下都要更新(

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

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

训练指南 UVA - 10917(最短路Dijkstra + 基础DP)

layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: true mathjax: true tags: - 最短路 - 基础DP - Dijkstra - 图论 - 训练指南 Walk Through the Forest UVA - 10917 题意 Jimmy打算每天沿着一条不同的路走,而且,他只能沿着满足如下条件的道路(A,B):存在一条从B出发回家的路径,比