[HDOJ2066]一个人的旅行

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2066

 

一个人的旅行

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 25398    Accepted Submission(s): 8812


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
 
 
 
Dijkstra水过
 
 
 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <cmath>
 7 #include <queue>
 8 #include <stack>
 9 #include <list>
10 #include <vector>
11 
12 using namespace std;
13 
14 const int INF = 0x7f7f7f7f;
15 const int maxn = 1010;
16 
17 int G[maxn][maxn];
18 int dd[maxn];
19 bool b[maxn];
20 int n, m, tmp;
21 int a[maxn], s[maxn];
22 
23 void diskstra() {
24     memset(b, 0, sizeof(b));
25     b[0] = 1;
26     int id, mmin;
27     int i, t;
28     t = tmp;
29     for(i = 0; i <= tmp; i++) {
30         dd[i] = G[0][i];
31     }
32     while(t--) {
33         mmin = INF;
34         for(i = 1; i <= tmp; i++)
35             if(!b[i] && dd[i] < mmin) {
36                 mmin = dd[i];
37                 id = i;
38             }
39             b[id]  = 1;
40             for(int i = 1; i <= tmp; i++) {
41                if(!b[i] && dd[i] > dd[id] + G[id][i]) {
42                    dd[i] = dd[id] + G[id][i];
43                }
44             }
45     }
46 }
47 
48 int main()
49 {
50     // freopen("in", "r", stdin);
51     int u, v, w, k;
52     while(scanf("%d %d %d", &m, &n, &k) != EOF) {
53         int ans = INF;
54         tmp = 0;
55         for(int i = 0; i < maxn; i++) {            
56             for(int j = 0; j < maxn; j++) {
57                 G[i][j] =  INF;
58             }
59         }
60         for(int i = 0; i < m; i++) {
61             scanf("%d %d %d", &u, &v, &w);
62             if(u > tmp) {
63                 tmp = u;
64             }
65             if(v > tmp) {
66                 tmp=v;
67             }
68             G[u][v] = G[u][v] > w ? w : G[u][v];
69             G[v][u] = G[u][v];
70         }
71         for(int i = 0; i < n; i++) {
72             scanf("%d", &a[i]);
73             G[0][a[i]] = 0;
74             G[a[i]][0] = 0;
75         }
76         for(int i = 0; i < k; i++) {
77             scanf("%d", &s[i]);
78         }
79         diskstra();
80         for(int j = 0; j < k; j++) {
81             if(dd[s[j]] < ans) {
82                 ans=dd[s[j]];
83             }
84         }
85         printf("%d
", ans);
86     }
87     return 0;
88 }
 
原文地址:https://www.cnblogs.com/kirai/p/4761485.html