http://acm.hdu.edu.cn/showproblem.php?pid=2066
G++ 46ms,C++超时- -。。。
#include<stdio.h> #include<string.h> #define INF 0xfffffff #define N 1002 int map[N][N],vis[N],dis[N],near[N],des[N],n,T,S,D; int dijkstra(int start) { int i,j,k,min; memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) dis[i]=map[start][i]; dis[start]=0; vis[start]=1; for(i=1;i<=n;i++) { min=INF; for(j=1;j<=n;j++) if(!vis[j]&&dis[j]<min) { min=dis[j]; k=j; } if(min==INF) break; vis[k]=1; for(j=1;j<=n;j++) if(!vis[j]&&dis[j]>dis[k]+map[k][j]) dis[j]=dis[k]+map[k][j]; } min=INF; for(i=1;i<=D;i++) if(dis[des[i]]<min) min=dis[des[i]]; return min; } int main(void) { int i,j,a,b,time,temp,min; while(scanf("%d%d%d",&T,&S,&D)!=EOF) { for(i=1;i<=N;i++) for(j=1;j<=N;j++) map[i][j]=INF; n=0; for(i=1;i<=T;i++) { scanf("%d%d%d",&a,&b,&time); if(map[a][b]>time) map[a][b]=map[b][a]=time; if(a>n) n=a; if(b>n) n=b; } for(i=1;i<=S;i++) scanf("%d",&near[i]); for(i=1;i<=D;i++) scanf("%d",&des[i]); min=INF; for(i=1;i<=S;i++) { temp=dijkstra(near[i]); if(temp<min) min=temp; } printf("%d\n",min); } return 0; }