Lift Hopping (Uva 10801 最短路)

题意:n个电梯,100层楼,告诉每个电梯的速度和每个电梯会停的楼层数,起点在0层,终点是第k层,另外每次换乘需要等待60秒,问从0到k的最短时间是多少。

思路:这题就是读入比较蛋疼,然后根据输入建完图后跑一下Dijkstra。在更新时加入60秒。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define pi acos(-1.0)
#define eps 1e-6
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define FRE(i,a,b)  for(i = a; i <= b; i++)
#define FREE(i,a,b) for(i = a; i >= b; i--)
#define FRL(i,a,b)  for(i = a; i < b; i++)
#define FRLL(i,a,b) for(i = a; i > b; i--)
#define mem(t, v)   memset ((t) , v, sizeof(t))
#define sf(n)       scanf("%d", &n)
#define sff(a,b)    scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf          printf
#define DBG         pf("Hi\n")
typedef long long ll;
using namespace std;

#define INF 0x3f3f3f3f
#define mod 1000000009
const int maxn = 105;
const int MAXN = 3005;
const int MAXM = 200010;
const int N = 1005;

int mp[maxn][maxn],TIME[6];
int dist[maxn];
bool vis[maxn];
int n,k;
char str[MAXN];
int a[maxn];

int readLine(char *s)
{
    int L;
    for (L=0;(s[L]=getchar())!='\n'&&s[L]!=EOF;L++) ;
    s[L]=0;
    return L;
}

void Dijkstra()
{
    int i,j,now,mi;
    mem(dist,INF);
    mem(vis,false);
    for (i=0;i<100;i++)
        dist[i]=mp[0][i];
    dist[0]=0;
    vis[0]=true;
    for (i=0;i<100;i++)
    {
        now=-1;
        mi=INF;
        for (j=0;j<100;j++)
        {
            if (!vis[j]&&mi>dist[j])
            {
                now=j;
                mi=dist[j];
            }
        }
//        printf("now=%d\n",now);
        if (now==-1) break;
//        DBG;
        vis[now]=true;
        for (j=0;j<100;j++)
        {
            if (!vis[j]&&dist[j]>dist[now]+mp[now][j]+60)
                dist[j]=dist[now]+mp[now][j]+60;
        }
    }
//    for (i=0;i<=30;i++)
//        pf("%d ",dist[i]);
    if (dist[k]>=INF)
        pf("IMPOSSIBLE\n");
    else
        pf("%d\n",dist[k]);
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("C:/Users/lyf/Desktop/IN.txt","r",stdin);
#endif
    int i,j;
    while (~sff(n,k))
    {
        mem(mp,INF);
        for (i=0;i<n;i++) sf(TIME[i]);
        getchar();
        for (i=0;i<n;i++)
        {
            readLine(str);
            int num=0,cnt=0;
            while (sscanf(str+num,"%d",&a[cnt])==1)
            {
                cnt++;
                while (str[num]&&str[num]==' ') num++;
                while (str[num]&&str[num]!=' ') num++;
            }
//            for (j=0;j<cnt;j++)
//                pf("%d ",a[j]);
//            cout<<endl;
            for (j=0;j<cnt;j++)
                for (int kk=j+1;kk<cnt;kk++)
                    mp[a[j]][a[kk]]=mp[a[kk]][a[j]]=min(mp[a[kk]][a[j]],(a[kk]-a[j])*TIME[i]);
        }
        Dijkstra();
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-22 09:59:12

Lift Hopping (Uva 10801 最短路)的相关文章

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 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[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

[题解]UVA10801 Lift Hopping

链接:http://vjudge.net/problem/viewProblem.action?id=22172 描述:有n部电梯,每部电梯都有不能停下的楼层,要求搭乘电梯从第0层到第k层. 思路:单源点最短路 建图:将每层楼拆成n个点,用边权解决换乘等待的时间.将每部电梯能到达的楼层顺次连接,边权是该电梯经过所需时间.最后建立一个超级源点S,连接每部电梯的第0层的节点,边权为0,方便统计答案. 下面是我的实现,Dijkstra版本: 1 #include <iostream> 2 #incl

uva 10269 最短路+dp

题意:有a个村庄.b个城镇, 编号分别为:1-a , a+1--a+b . 有双神奇的鞋,可以瞬时移动,可以使用k次,每次可以移动L , 但穿这双鞋的时候,不能经过城镇 , 问:从a+b 到 1 最短距离是多少? 刚开始看这个题时 , 一点思路都没有 , dp类型的题目做得太少了. 解法:进行状态压缩, 用点+使用鞋子的次数 , 来表示一个状态 , d[i][k] , 表示到 点 i 使用 k 次鞋子的最短距离是多少. 但要先进行初始化 , 求任意点之间不经过城镇的最短距离 , 用floyd算法

uva 11374 最短路+记录路径 dijkstra最短路模板

UVA - 11374 Airport Express Time Limit:1000MS   Memory Limit:Unknown   64bit IO Format:%lld & %llu [Submit]  [Go Back]  [Status] Description ProblemD: Airport Express In a small city called Iokh, a train service, Airport-Express, takes residents to t

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 最短路

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