一个人的旅行
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9503 Accepted Submission(s): 3244
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
Sample Output
9
Author
Grass
Source
Recommend
lcy
code:
1 #include <iostream> 2 #include <iomanip> 3 #include <fstream> 4 #include <sstream> 5 #include <algorithm> 6 #include <string> 7 #include <set> 8 #include <utility> 9 #include <queue> 10 #include <stack> 11 #include <list> 12 #include <vector> 13 #include <cstdio> 14 #include <cstdlib> 15 #include <cstring> 16 #include <cmath> 17 #include <ctime> 18 #include <ctype.h> 19 using namespace std; 20 21 #define MAXN 1005 22 23 int t,s,d; //有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个 24 int a,b,times; //表示a,b城市之间的车程是time小时 25 int map[MAXN][MAXN]; 26 int dis[MAXN]; 27 int des; 28 int nearby; 29 int lowdis; 30 int ddv; 31 32 33 void Dijkstra() 34 { 35 int start=0; 36 int i,j; 37 bool vst[MAXN]; 38 for(i=0;i<=ddv;i++) 39 { 40 dis[i]=map[start][i]; 41 vst[i]=0; 42 } 43 vst[start]=1; 44 for(i=1;i<=ddv;i++) 45 { 46 int mindis=INT_MAX; 47 int nextgoal=start; 48 for(j=0;j<=ddv;j++) 49 if(!vst[j]&&dis[j]<mindis) 50 { 51 mindis=dis[j]; 52 nextgoal=j; 53 } 54 vst[nextgoal]=1; 55 for(j=0;j<=ddv;j++) 56 if(!vst[j]&&map[nextgoal][j]<INT_MAX) 57 { 58 int updatedis=dis[nextgoal]+map[nextgoal][j]; 59 if(updatedis<dis[j]) 60 dis[j]=updatedis; 61 } 62 } 63 } 64 65 int main() 66 { 67 int i,j; 68 while(~scanf("%d%d%d",&t,&s,&d)) 69 { 70 ddv=0; 71 lowdis=INT_MAX; 72 for(i=0;i<=1001;i++) 73 for(j=0;j<=1001;j++) 74 map[i][j]=INT_MAX; 75 for(i=0;i<t;i++) 76 { 77 scanf("%d%d%d",&a,&b,×); 78 if(map[a][b]>times) 79 { 80 map[a][b]=times; 81 map[b][a]=times; 82 if(ddv<a) 83 ddv=a; 84 if(ddv<b) 85 ddv=b; 86 } 87 } 88 for(i=1;i<=s;i++) 89 { 90 scanf("%d",&nearby); 91 map[0][nearby]=0; 92 } 93 Dijkstra(); 94 int lowest=INT_MAX; 95 for(i=1;i<=d;i++) 96 { 97 scanf("%d",&des); 98 if(dis[des]<lowdis) 99 lowdis=dis[des]; 100 } 101 printf("%d\n",lowdis); 102 } 103 return 0; 104 }