hdu-2066 一个人的旅行
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个数,表示草儿想去地方。
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
1 /* 2 1.定义一个邻接矩阵map,存放各点间最短路径 3 2.定义一个数组home,存放邻近家的地点 4 3.定义一个数组visit,存放想去的地方 5 4.改写dijkstra,形如:int dijkstra(int map[][],int p,int visit[]); 6 使其返回起点到想去地方的最短距离 7 5.定义一个数组minDis,存放各个dijksrta的返回值 8 6.选出minDis中最小的值,输出 9 */ 10 11 /* 12 输入数据有多组,每组的第一行是三个整数T,S和D, 13 表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个; 14 接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时; 15 (1=<(a,b)<=1000;a,b 之间可能有多条路) 16 接着的第T+1行有S个数,表示和草儿家相连的城市; 17 接着的第T+2行有D个数,表示草儿想去地方。 18 */ 19 #include <stdio.h> 20 #include <string.h> 21 #define INF 2000000000 //一定要足够大 22 #define MAX 100 23 24 int dijkstra(int map[MAX][MAX],int p,int visit[],int d); 25 26 int main() 27 { 28 int t,s,d; 29 int a,b,time; 30 int map[MAX][MAX]; 31 int home[MAX]; 32 int visit[MAX]; 33 int minDis[MAX]; 34 int minD; 35 int i,j; 36 while (~scanf("%d%d%d",&t,&s,&d)) 37 { 38 if (t==0) 39 break; 40 for (i=1; i<MAX; i++) //将邻接矩阵初始化为INF 41 for (j=1; j<MAX; j++) 42 map[i][j] = INF; 43 for (i=1; i<=t; i++) //更新邻接矩阵的值 44 { 45 scanf("%d%d%d",&a,&b,&time); 46 if (map[a][b]>time) //选取两点之间最短路径 47 map[a][b] = map[b][a] = time; 48 } 49 for (i=1; i<=s; i++) //输入s个邻近家的地方 50 scanf("%d",&home[i]); 51 for (i=1; i<=d; i++) //输入d个想去的地方 52 scanf("%d",&visit[i]); 53 for (i=1; i<=s; i++) //将邻近家的地方依次作为起点 54 { 55 minDis[i] = dijkstra(map,home[i],visit,d); 56 } 57 minD = minDis[1]; 58 for (i=2; i<=s; i++) //从各个不同的起点到目的地的最小距离中再选出最小的 59 if (minD>minDis[i]) 60 minD = minDis[i]; 61 printf("%d\n",minD); //输出 62 } 63 return 0; 64 } 65 66 int dijkstra(int map[MAX][MAX],int p,int visit[],int d) 67 { 68 int dist[MAX]; 69 int s[MAX]; 70 int minDist = INF; 71 int mint; 72 int t; 73 int temp; 74 int i,j; 75 for (i=1; i<MAX; i++) 76 dist[i] = map[p][i]; 77 memset(s,0,MAX*sizeof(int)); 78 s[p] = 1; 79 dist[p] = 0; 80 for (i=1; i<MAX; i++) 81 { 82 mint = INF; 83 t = p; 84 for (j=1; j<MAX; j++) 85 if (mint>dist[j]&&!s[j]) 86 { 87 mint = dist[j]; 88 t = j; 89 } 90 s[t] = 1; 91 for (j=1; j<MAX; j++) 92 if (!s[j]&&map[t][j]<INF) 93 if (dist[t]+map[t][j]<dist[j]) 94 dist[j] = dist[t]+map[t][j]; 95 } 96 for (i=1; i<=d; i++) 97 { 98 temp = visit[i]; 99 if (dist[temp]<minDist) 100 minDist = dist[temp]; 101 } 102 return minDist; 103 }
蒹葭苍苍,白露为霜;
所谓伊人,在水一方。