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

UVA 10801 Lift Hopping Floyd

时间:2015-04-09 21:48:33      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:UVA - 10801

题意描述:有n个电梯,给出每个电梯可以到达的楼层位置和电梯上升或下降一层楼的时间,另外在同一层楼换乘不同的电梯需要等待一分钟,问从楼层位置0(即地面)到第k层楼需要的最短时间是多少。

算法分析:由于n很小(n<100),所有可以用Floyd算法搞之。注意换乘电梯时需要加上那60秒即可了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<algorithm>
 7 #define inf 0x7fffffff
 8 using namespace std;
 9 const int maxn=100+10;
10 
11 int n,k,an[maxn],d[maxn][maxn],bn[maxn];
12 char str[3*maxn];
13 
14 int main()
15 {
16     while (scanf("%d%d",&n,&k)!=EOF)
17     {
18         for (int i=1 ;i<=n ;i++) scanf("%d",&an[i]);
19         memset(str,0,sizeof(str));
20         for (int i=0 ;i<maxn ;i++)
21         {
22             for (int j=0 ;j<maxn ;j++)
23                 d[i][j]= i==j ? 0 : 99999999;
24         }
25         getchar();
26         for (int i=1 ;i<=n ;i++)
27         {
28             gets(str);
29             int len=strlen(str);
30             int num=0,ok=0;
31             int cnt=0;
32             for (int j=0 ;j<len ;j++)
33             {
34                 if (str[j]==  && ok) {bn[cnt++]=num;num=0;ok=0;}
35                 else
36                 {
37                     num=num*10+str[j]-0;
38                     ok=1;
39                 }
40                 if (j==len-1 && ok) bn[cnt++]=num;
41             }
42             for (int j=0 ;j<cnt ;j++)
43             {
44                 for (int u=j+1 ;u<cnt ;u++)
45                 {
46                     if (d[bn[j] ][bn[u] ]>an[i]*(bn[u]-bn[j])) {
47                         d[bn[j] ][bn[u] ]=d[bn[u] ][bn[j] ]=an[i]*(bn[u]-bn[j]);
48                     }
49 
50                 }
51             }
52         }
53         for (int i=0 ;i<maxn ;i++)
54         {
55             for (int j=0 ;j<maxn ;j++) if (i!=j)
56             {
57                 for (int u=0 ;u<maxn ;u++) if (i!=u && j!=u)
58                     d[j][u]=min(d[j][u],d[j][i]+d[i][u]+60);
59             }
60         }
61         if (d[0][k]==99999999) printf("IMPOSSIBLE\n");
62         else printf("%d\n",d[0][k]);
63     }
64     return 0;
65 }

 

UVA 10801 Lift Hopping Floyd

标签:

原文地址:http://www.cnblogs.com/huangxf/p/4412053.html

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