UVa 10801 Lift Hopping / floyd

来源:互联网 发布:淘宝设置满多少包邮 编辑:程序博客网 时间:2024/05/19 03:46

乘电梯 求到目标层的最短时间 有n个电梯 换一个电梯乘需要额外60秒

所以建图时每个电梯自己能到的层数先把时间算好 这是不需要60秒的

然后做floyd时 如果松弛 肯定是要换电梯 所以要加60秒

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>#include <cmath>#include <cstdlib>using namespace std;int a[110][110];int b[110];int n,m;void floyd(){int i,j,k;for(k = 0;k <= 100; k++)for(i = 0;i <= 100; i++)for(j = 0;j <= 100; j++)a[i][j] = min(a[i][j],a[i][k]+a[k][j]+60);}int main(){int t,n,i,j,k;while(scanf("%d %d",&n,&m)!=EOF){//for(k = 1;k <= n; k++)for(i = 0;i <= 100; i++)for(j = 0;j <= 100; j++){if(i == j)a[i][j] = 0;elsea[i][j] = 999999999;}for(i = 0; i < n; i++)scanf("%d",&b[i]);getchar();for(i = 0; i < n; i++){char str[1000];char *p;gets(str);//puts(str);p = strtok(str," ");int cnt[110];int j = 0;while(p){cnt[j++] = atoi(p);p = strtok(NULL," ");}for(k = 1 ;k < j; k++){for(t = 0; t < k; t++){a[cnt[t]][cnt[k]] = min(a[cnt[t]][cnt[k]],b[i]*abs(cnt[k]-cnt[t]));a[cnt[k]][cnt[t]] = min(a[cnt[k]][cnt[t]],b[i]*abs(cnt[k]-cnt[t]));}}}floyd();if(a[0][m] == 999999999)puts("IMPOSSIBLE");elseprintf("%d\n",a[0][m]);}return 0;}


 

0 0
原创粉丝点击