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