Dij算法 需要对每个电梯进行预处理
#include <algorithm> #include <cstring> #include <cstdio> #define INF 9999 #define N 110 using std::min; using std::sort; int dp[N][N]; int a[N]; int d[N]; int n,m; char ch; int time[7]; int v[N]; int front,rear; void solve(int k,int nx) { sort(a, a+nx); for(int i=0; i<nx; ++i) { for(int j=i+1; j<nx; ++j) { int c=a[i],d=a[j]; int cc=(d-c)*time[k]; if(dp[c][d]>cc) dp[d][c]=dp[c][d]=cc; } } } int main() { while(scanf("%d %d",&n,&m)==2) { for(int i=0; i<n; ++i) scanf("%d",&time[i]); for(int i=0; i<N; ++i) d[i]=INF; for(int i=0; i<N; ++i) for(int j=0; j<N; ++j) dp[i][j]=INF; for(int i=0; i<n; ++i) { int ans=0; while(scanf("%d%c",&front,&ch)==2) { a[ans++]=front; if(ch=='\n') break; } solve(i,ans); } memset(v, 0, sizeof(v)); d[0]=0; for(int i=0; i<=100; ++i) { int x,mm=INF; for(int y=0; y<=100; ++y) if(!v[y] && d[y]<mm) mm=d[x=y]; v[x]=1; for(int y=0; y<=100; ++y) d[y]=min(d[y],d[x]+dp[x][y]+60); } if(d[m]>=INF) puts("IMPOSSIBLE"); else if(!m) printf("0\n"); else printf("%d\n",d[m]-60); } return 0; }