• uva 10801


     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=='
    ')
    70                  break; 
    71            }
    72        } 
    73        
    74        Dijkstra();
    75        
    76        if(k==0)
    77           printf("0
    ");       
    78        else if(d[k]!=INF)
    79           printf("%d
    ", d[k]-60);
    80        else printf("IMPOSSIBLE
    "); 
    81    }
    82    return 0;
    83 }
  • 相关阅读:
    20161203
    20161201
    20161128课堂笔记
    数组排序 (选择排序、冒泡排序、插入排序、希尔排序)
    编一个多用户登陆程序
    20161115课堂笔记
    20161114课堂笔记
    20161111课堂笔记
    面试常见问题
    java 基础第一周
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/3900059.html
Copyright © 2020-2023  润新知