hdoj 2066 一个人的旅行
最短路问题,把0(小草所在的)城市与相邻城市设置为0,然后就是求出每想去城市的最短路径,从每个最短路径中取出最小值
1 #include <stdio.h> 2 #define min(a, b) a < b ? a : b 3 #define inf 0x7FFFFFFF 4 #define M 1001 5 6 int map[M][M]; 7 int dist[M]; 8 int visit[M]; 9 10 int t, s, d, k; 11 12 int mdist(int res, int des) //最短路函数 13 { 14 int i = 0; 15 for (i = 0; i < M; i++) 16 { 17 dist[i] = inf; 18 visit[i] = inf; 19 } 20 visit[res] = 0; 21 dist[res] = 0; 22 while (res != des) 23 { 24 int min = inf, next, f = 0; 25 for (i = 0; i < M; i++) 26 { 27 if (map[res][i] != inf) 28 { 29 dist[i] = min(dist[i], dist[res] + map[res][i]); 30 } 31 if (visit[i] && min > dist[i]) 32 { 33 min = dist[i]; 34 next = i; 35 } 36 } 37 if (min == inf) 38 break; 39 res = next; 40 visit[res] = 0; 41 } 42 return dist[des]; 43 } 44 int main() 45 { 46 while (scanf("%d %d %d", &t, &s, &d) != -1) 47 { 48 int i, j, a, b, l; 49 for (i = 0; i < M; i++) 50 { 51 for (j = 0; j < M; j++) 52 map[i][j] = inf; 53 } 54 55 for (i = 0; i < t; i++) 56 { 57 scanf("%d %d %d", &a, &b, &l); 58 map[a][b] = map[b][a] = min(map[a][b], l); 59 } 60 61 for (i = 0; i < s; i++) 62 { 63 scanf("%d", &a); 64 map[a][0] = map[0][a] = 0; 65 } 66 int min = inf, kk; 67 for (i = 0; i < d; i++) 68 { 69 scanf("%d", &a); 70 kk = mdist(0, a); 71 if (min > kk) 72 min = kk; 73 } 74 printf("%d\n", min); 75 } 76 return 0; 77 }
浙公网安备 33010602011771号