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>
#include <string>
#include <vector>
#include <climits>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define PI 3.1415926535897932626
using namespace std;
int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
#define MAXN 105
const int INF = 0x3f3f3f3f;
int T[10],N,K;
int w[MAXN][MAXN],d[MAXN];
int src[MAXN];
typedef pair<int,int> pii;
priority_queue<pii,vector<pii>,greater<pii> > q;
void read()
{
    memset(w,0x3f,sizeof(w));
    for (int i = 0; i < N; i++) scanf("%d",&T[i]);
    for (int i = 0; i < N; i++)
    {
        int cas = 0;
        char ch;
        do
        {
            scanf("%d",&src[cas++]);
            ch = getchar();
        }while (ch != ‘\n‘);
        for (int j = 0; j < cas; j++)
            for (int k = j; k < cas; k++)
              {
                  w[src[j]][src[k]] = min(w[src[j]][src[k]],abs(src[k] - src[j]) * T[i]);
                  w[src[k]][src[j]] = min(w[src[k]][src[j]],abs(src[k] - src[j]) * T[i]);
              }
    }
}
void SPFA()
{
    bool inq[MAXN];
    memset(inq,false,sizeof(inq));
    memset(d,0x3f,sizeof(d));
    d[0] = 0;
    queue<int>que;
    while (!que.empty()) que.pop();
    que.push(0);
    while (!que.empty())
    {
        int u = que.front();que.pop();
        inq[u] = false;
        for (int i = 0; i < MAXN; i++)
        {
            if (u == 0)
            {
                if (d[i] > d[u] + w[u][i])
                {
                    d[i] = d[u] + w[u][i];
                    if (!inq[i])
                    {
                        inq[i] = true;
                        que.push(i);
                    }
                }
            }
            else
            {
                if (d[i] > d[u] + w[u][i] + 60)
                {
                    d[i] = d[u] + w[u][i] + 60;
                    if (!inq[i])
                    {
                        inq[i] = true;
                        que.push(i);
                    }
                }
            }
        }
    }
}
void dijkstra()
{
    memset(d,0x3f,sizeof(d));
    d[0] = 0;
    q.push(make_pair(d[0],0));
    while (!q.empty())
    {
        pii t = q.top();q.pop();
        int u = t.second;
        if (t.first != d[u]) continue;
        for (int v = 0; v < MAXN; v++)
        {
            if (u == 0)
            {
                if (d[v] > d[u] + w[u][v])
                {
                    d[v] = d[u] + w[u][v];
                    q.push(make_pair(d[v],v));
                }
            }
            else
            {
                if (d[v] > d[u] + w[u][v] + 60)
                {
                    d[v] = d[u] + w[u][v] + 60;
                    q.push(make_pair(d[v],v));
                }
            }
        }
    }
}
int main()
{
    //freopen("sample.txt","r",stdin);
    while (scanf("%d%d",&N,&K) != EOF)
    {
        read();
        SPFA();
        //dijkstra();
        if (d[K] == INF) puts("IMPOSSIBLE");
        else printf("%d\n",d[K]);
    }
    return 0;
}
时间: 2024-12-04 22:53:23

UVA 10801 Lift Hopping 最短路的相关文章

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[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]的最小值,更新的时候往上往下都要更新(

[题解]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 11248 Frequency Hopping (最大流)

uva 11248 Frequency Hopping 题目大意:给定一个有向网络,每条边均有一个容量. 问是否存在一个从点1到点N.流量为C的流.假设不存在,能否够恰好改动一条弧的容量,使得存在这种流. 解题思路:先依照题目给出的边建好图,然后跑一发最大流,得到原始最大流C1,假设C1==C或者C==0时.能够直接输出possible.假设不存在这种流.那么開始找割边,将这些割边的容量添加C,再求最大流.假设能够,那么要输出全部的方案.改动全部割边后,仍没有符合条件的流,输出 not poss