Problem Description
虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。
Input
输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;
接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数,表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。
接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数,表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。
Output
输出草儿能去某个喜欢的城市的最短时间。
Sample Input
6 2 3
1 3 5
1 4 7
2 8 12
3 8 4
4 9 12
9 10 2
1 2
8 9 10
1 3 5
1 4 7
2 8 12
3 8 4
4 9 12
9 10 2
1 2
8 9 10
Sample Output
9
***************************************************************************************************************************
1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #include<cstdio> 7 using namespace std; 8 const int inf=1<<29; 9 int dis[1111]; 10 int map[1111][1111]; 11 int T,D,S,n; 12 int src[1111],love[1111]; 13 bool vis[1111]; 14 int i,j,k; 15 void bellman(int s) 16 { 17 int it,jt,gs; 18 int minn; 19 for(it=1;it<=1050;it++) 20 { 21 dis[it]=map[s][it]; 22 //cout<<"dis:: "<<dis[it]<<endl; 23 } 24 25 vis[s]=true; 26 dis[s]=0; 27 for(it=1;it<1050;it++) 28 { 29 minn=inf; 30 for(jt=1;jt<=1050;jt++) 31 { 32 if(!vis[jt]&&dis[jt]<minn) 33 { 34 minn=dis[jt]; 35 gs=jt; 36 } 37 } 38 vis[gs]=true; 39 if(minn==inf)break; 40 for(jt=1;jt<=1050;jt++) 41 { 42 if(!vis[jt]&&dis[jt]>map[gs][jt]+dis[gs]&&map[gs][jt]!=inf) 43 dis[jt]=dis[gs]+map[gs][jt]; 44 //cout<<"dis:: "<<dis[jt]<<endl; 45 } 46 } 47 } 48 int main() 49 { 50 int a,b,time; 51 while(~scanf("%d%d%d",&T,&S,&D)) 52 { 53 n=0; 54 for(i=0;i<=1050;i++) 55 for(j=0;j<=1050;j++) 56 map[i][j]=inf; 57 for(i=0;i<=1050;i++) 58 map[i][i]=0; 59 for(i=1;i<=T;i++) 60 { 61 scanf("%d%d%d",&a,&b,&time); 62 if(map[a][b]>time) 63 map[a][b]=map[b][a]=time; 64 //if(a>n)n=a; 65 //if(b>n)n=b; 66 } 67 for(i=1;i<=S;i++) 68 scanf("%d",&src[i]); 69 for(i=1;i<=D;i++) 70 scanf("%d",&love[i]); 71 int mintime=inf; 72 for(i=1;i<=S;i++) 73 { 74 memset(vis,false,sizeof(vis)); 75 bellman(src[i]); 76 for(j=1;j<=D;j++) 77 { 78 //cout<<"dis:: "<<dis[love[j]]<<endl; 79 if(dis[love[j]]<mintime) 80 mintime=dis[love[j]]; 81 } 82 } 83 printf("%d ",mintime); 84 } 85 return 0; 86 }