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