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 }

posted on 2012-08-11 12:43  Xor<>OR  阅读(230)  评论(0)    收藏  举报

导航