#include<stdio.h> #include<string.h> #define max 505 #define maxcost 255001 int phone[10001]; int g[max][max]; int n,m,t; int dist[max][max]; void floyd() { int i,j,k; for(k=1;k<=m;k++) for(i=1;i<=m;i++) for(j=1;j<=m;j++) { if(dist[i][j]>dist[i][k]+dist[k][j]) dist[i][j]=dist[i][k]+dist[k][j]; } } main() { int i,j,k,q,a,b,c,ans,ca=1,flag,temp1,temp2,temp3,temp; int x,y,z; while(scanf("%d%d%d",&n,&m,&t)!=EOF) { memset(phone,0,sizeof(phone)); for(i=1;i<=n;i++) { scanf("%d",&k); phone[i]=k;//电话i与k连接 } for(i=1;i<=m;i++) for(j=1;j<=m;j++) { if(i==j) g[i][j]=0; else g[i][j]=maxcost; } for(i=0;i<t;i++) { scanf("%d%d%d",&a,&b,&c); if(g[a][b]>c) { g[a][b]=c; g[b][a]=c; } } for(i=1;i<=m;i++) for(j=1;j<=m;j++) dist[i][j]=g[i][j]; floyd(); scanf("%d",&q); printf("Case #%d/n",ca++); for(i=1;i<=q;i++) { ans=0;flag=1; scanf("%d%d%d",&x,&y,&z); if(dist[phone[x]][phone[y]]>=maxcost&&dist[phone[x]][phone[z]]>=maxcost) flag=0; if(dist[phone[y]][phone[x]]>=maxcost&&dist[phone[y]][phone[z]]>=maxcost) flag=0; if(dist[phone[z]][phone[y]]>=maxcost&&dist[phone[z]][phone[x]]>=maxcost) flag=0; if(flag==0) printf("Line %d: Impossible to connect!/n",i); else { temp1=dist[phone[x]][phone[y]]; temp2=dist[phone[x]][phone[z]]; temp3=dist[phone[y]][phone[z]]; if(temp1>temp2) { temp=temp1; temp1=temp2; temp2=temp; } if(temp2>temp3) { temp=temp2; temp2=temp3; temp3=temp; } ans+=temp1; ans+=temp2; for(j=1; j<=m; j++) { if(ans>dist[phone[x]][j]+dist[phone[y]][j]+dist[phone[z]][j]) ans=dist[phone[x]][j]+dist[phone[y]][j]+dist[phone[z]][j];//判断是否有共同交点 } // printf("Line %d: The minimum cost for this line is %d./n",i,ans); if(ans>=maxcost) printf("Line %d: Impossible to connect!/n",i); else printf("Line %d: The minimum cost for this line is %d./n",i,ans); } } } }