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

  •  最短路径问题。

思路:

  将草儿家置为源点,其到邻近城市的距离视为0,化为单源点的最短路径问题,用dijkstra算法即可解决。

代码:

 1 #include<iostream>
 2 #include<cmath>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 using namespace std;
 7 #define INF 1300 
 8 #define MAXN 1005
 9 
10 int t, s, d, n;
11 int map[MAXN][MAXN];
12 int vis[MAXN], cost[MAXN];    //cost[MAXN]用来记录从草儿家到其他城市所需的时间  
13 int ss[MAXN], dd[MAXN];
14 
15 void dijkstra()
16 {
17     int temp, len;
18     int minlen = INF;  //不管在外部定义还是在内部定义,一定要在内部初始化一遍,否则下次案例的初始minlen值就不是INF了
19     memset(vis, 0, sizeof(vis));    //初始化访问数组 
20     vis[0] = 1;        //将草儿家置为源点 
21     for(int i = 0; i <= n; i++)
22     {
23         cost[i] = map[0][i];    //初始化草儿家到其他城市的耗时 
24     }
25     for(int i = 1; i <= n; i++)      
26     {
27         len = INF; 
28         for(int j = 1; j <= n; j++)
29         {
30             if(cost[j] < len && !vis[j])
31             {
32                 len = cost[j];    //更新两城市间的距离 
33                 temp = j;    //暂存该城市 
34             }
35         }
36         vis[temp] = 1;    //找到耗时最短的城市归入图中 
37         for(int j = 1; j <= n; j++)
38         {
39             if(cost[temp] + map[temp][j] < cost[j] && !vis[j])     
40             {
41                 cost[j] = cost[temp] + map[temp][j];
42             }
43         }
44     }
45     for(int i = 0; i < d; i++)
46             minlen = min(minlen, cost[dd[i]]);
47         printf("%d\n", minlen);
48 }
49 
50 int main()
51 {
52     int a, b, time;
53     while(~scanf("%d%d%d", &t, &s, &d))
54     {
55         n = 0;
56         for(int i = 0; i < MAXN; i++)    //初始化从i到j城市的耗时 
57         {
58             for(int j = 0; j < MAXN; j++)
59                 if(i == j)
60                     map[i][j] = 0;
61                 else 
62                     map[i][j] = INF;
63         }
64         while(t--)
65         {
66             cin >> a >> b >> time;     
67             n = max(max(n, a), b);    //有n个城市 
68             if(time < map[a][b])    //更新从a到b城市的耗时 
69                 map[a][b] = map[b][a] = time;
70         }
71         for(int i = 0; i < s; i++)
72         {
73             cin >> ss[i];
74             map[0][ss[i]] = map[ss[i]][0] = 0;    //从草儿家到相邻城市不计入总耗时 
75         }
76         for(int i = 0; i < d; i++)
77         {
78             cin >> dd[i];    //输入要去的城市
79         }
80         
81         dijkstra();
82         
83     }
84     return 0;
85 }

 

总结:

  • 初始化要做好,思维还不够全面吧,十分欠缺,多训练!!
  • 最短路径问题重点在

 

posted @ 2019-07-07 16:22  Anzer  阅读(170)  评论(0编辑  收藏  举报