码迷,mamicode.com
首页 > 其他好文 > 详细

Lift Hopping (Uva 10801 最短路)

时间:2015-07-28 23:18:15      阅读:147      评论:0      收藏:0      [点我收藏+]

标签: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;
}


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

Lift Hopping (Uva 10801 最短路)

标签:lift hopping   uva 10801   最短路   

原文地址:http://blog.csdn.net/u014422052/article/details/47111739

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!