一个人的旅行
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 28925 Accepted Submission(s):
9942
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
将草儿的家看作城市0,能从家直接到的城市距离为0,其他为MAX。
题意:中文题,很好理解。
附上代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define M 1005 5 #define MAX 0x3f3f3f3f 6 using namespace std; 7 int map[M][M],vis[M],dis[M]; 8 int main() 9 { 10 int n,m,i,j,T,S,D; 11 while(~scanf("%d%d%d",&T,&S,&D)) 12 { 13 memset(vis,0,sizeof(vis)); 14 memset(dis,0,sizeof(dis)); 15 for(i=0; i<=1000; i++) 16 for(j=0; j<=1000; j++) 17 { 18 if(i==j) map[i][j]=0; 19 else map[i][j]=MAX; 20 } 21 int a,b,c; 22 n=0; 23 while(T--) 24 { 25 scanf("%d%d%d",&a,&b,&c); 26 if(a>n) n=a; 27 if(b>n) n=b; 28 if(map[a][b]>c) 29 map[a][b]=c,map[b][a]=c; 30 } 31 int k; 32 for(i=1; i<=S; i++) 33 { 34 scanf("%d",&k); 35 map[0][k]=0; //将小草的家看作城市0 36 map[k][0]=0; 37 } 38 vis[0]=1; 39 for(i=0; i<=n; i++) 40 dis[i]=map[0][i]; 41 int min,t; 42 for(i=1; i<=n; i++) 43 { 44 min=MAX; 45 for(j=1; j<=n; j++) 46 if(!vis[j]&&dis[j]<min) 47 { 48 min=dis[j]; 49 t=j; 50 } 51 52 vis[t]=1; 53 for(j=1; j<=n; j++) 54 if(!vis[j]&&map[j][t]<MAX) 55 if(dis[j]>dis[t]+map[j][t]) 56 dis[j]=dis[t]+map[j][t]; 57 } 58 min=MAX; 59 for(i=1; i<=D; i++) 60 { 61 scanf("%d",&k); 62 if(min>dis[k]) //寻找草儿想去的路程最短的城市 63 min=dis[k]; 64 } 65 printf("%d ",min); 66 } 67 return 0; 68 }
邻接表:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #define M 10005 6 #define N 1005 7 #define INF 0x3f3f3f3f 8 #define ll long long 9 using namespace std; 10 int T,S,D,tol; 11 struct Edge 12 { 13 int from,to,val; 14 int next; 15 }edge[M*2]; 16 int dis[N],head[M*2]; 17 bool vis[N]; 18 19 void init() 20 { 21 tol=0; 22 memset(head,-1,sizeof(head)); 23 } 24 25 void addEdge(int u,int v,int val) 26 { 27 edge[tol].from=u; 28 edge[tol].to=v; 29 edge[tol].val=val; 30 edge[tol].next=head[u]; 31 head[u]=tol++; 32 edge[tol].from=v; 33 edge[tol].to=u; 34 edge[tol].val=val; 35 edge[tol].next=head[v]; 36 head[v]=tol++; 37 } 38 39 void getmap() 40 { 41 int a,b,c; 42 while(T--) 43 { 44 scanf("%d%d%d",&a,&b,&c); 45 addEdge(a,b,c); 46 } 47 int x; 48 while(S--) 49 { 50 scanf("%d",&x); 51 addEdge(0,x,0); 52 } 53 memset(dis,INF,sizeof(dis)); 54 memset(vis,false,sizeof(vis)); 55 } 56 57 void spfa() 58 { 59 queue<int>q; 60 q.push(0); 61 vis[0]=true; 62 dis[0]=0; 63 while(!q.empty()) 64 { 65 int u=q.front(); 66 q.pop(); 67 vis[u]=false; 68 for(int i=head[u];i!=-1;i=edge[i].next) 69 { 70 int v=edge[i].to; 71 if(dis[v]>dis[u]+edge[i].val) 72 { 73 dis[v]=dis[u]+edge[i].val; 74 if(!vis[v]) 75 { 76 vis[v]=true; 77 q.push(v); 78 } 79 } 80 } 81 } 82 int x,minx=INF; 83 while(D--) 84 { 85 scanf("%d",&x); 86 if(minx>dis[x]) 87 minx=dis[x]; 88 } 89 printf("%d ",minx); 90 return; 91 } 92 93 int main() 94 { 95 while(~scanf("%d%d%d",&T,&S,&D)) 96 { 97 init(); 98 getmap(); 99 spfa(); 100 } 101 return 0; 102 }