乘电梯 求到目标层的最短时间 有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;
}