http://acm.hdu.edu.cn/showproblem.php?pid=2066
#include<iostream> using namespace std; const int Max=1000000000; int map[1001][1001]; int sor[1001],dis[1001]; int N,M,t,s,d,pr;
void dijkstra(int s) { int dist[1001],mark[1001],i,j,min,index; for(i=N;i<=M;i++) { mark[i]=0; dist[i]=map[s][i]; } mark[s]=1; dist[s]=0; for(i=N;i<=M;i++) { min=Max; for(j=N;j<=M;j++) { if(mark[j]==0 && dist[j]<min) { min=dist[j]; index=j; } } if(min==Max) break; mark[index]=1; for(j=N;j<=M;j++) { if(mark[j]==0 && dist[j]>dist[index]+map[index][j] ) dist[j]=dist[index]+map[index][j]; } } for(i=1;i<=d;i++) if(dist[dis[i]]<pr) pr=dist[dis[i]]; }
int main() { int i,j,k,ds; while(cin>>t>>s>>d) { for(i=1;i<=1000;i++) for(j=1;j<=1000;j++) map[i][j]=Max; M=-1; N=1002; for(k=1;k<=t;k++) { scanf("%d%d%d",&i,&j,&ds); if(ds<map[i][j]) //?????????????????????????????WA??n?????????? map[i][j]=map[j][i]=ds; if(M<i) M=i; if(N>i) N=i; if(M<j) M=j; if(N>j) N=j; } for(k=1;k<=s;k++) scanf("%d",&sor[k]); for(k=1;k<=d;k++) scanf("%d",&dis[k]); pr=Max; for(k=1;k<=s;k++) dijkstra(sor[k]); cout<<pr<<endl; } return 0; }
|