乘电梯 求到目标层的最短时间 有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; else a[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"); else printf("%d ",a[0][m]); } return 0; }