//开始的时候在ford()函数中多加了两个等于号,tlr #include<stdio.h> #define data 99999999999ll long long map[101][101],dis[101],ans; int arr[101]; int l1,l2,l3,l4,c1,c2,c3,c4,n1,m1,d; long long int ford(int n1,int aa,int bb) { int i,j,k; for(i=1;i<=n1;i++) dis[i]=data; dis[aa]=0; for(k=1;k<n1;k++) { int flag=0; for(i=1;i<=n1;i++) { for(j=1;j<=n1;j++) { if(map[i][j]<data&&dis[i]<data) //不包括等于的情况,否则tlr { if(dis[j]>map[i][j]+dis[i]) { dis[j]=map[i][j]+dis[i];flag=1;} } } } if(flag==0)break; } return dis[bb]; } int main() { int n,i,j,flag=0; scanf("%d",&n); while(n--) { scanf("%d%d%d%d%d%d%d%d",&l1,&l2,&l3,&l4,&c1,&c2,&c3,&c4); scanf("%d%d",&n1,&m1); for(i=1;i<=n1;i++) scanf("%d",&arr[i]); for(i=1;i<=n1;i++) for(j=1;j<=n1;j++) if(i!=j)map[i][j]=data; else map[i][j]=0; for(i=1;i<=n1;i++) { for(j=i+1;j<=n1;j++) { d=arr[i]-arr[j]; if(d<0)d=-d; if(0<d&&d<=l1)map[i][j]=map[j][i]=c1; if(d>l1&&d<=l2)map[i][j]=map[j][i]=c2; if(d>l2&&d<=l3)map[i][j]=map[j][i]=c3; if(d>l3&&d<=l4)map[i][j]=map[j][i]=c4; } } flag++; printf("Case %d:\n",flag); int aa,bb; for(i=1;i<=m1;i++) { scanf("%d%d",&aa,&bb); ans=ford(n1,aa,bb);//map[aa][bb] if(ans<data) printf("The minimum cost between station %d and station %d is %I64d.\n",aa,bb,ans); else printf("Station %d and station %d are not attainable.\n",aa,bb); } } return 0; }