码迷,mamicode.com
首页 > 其他好文 > 详细

杭电 2066 一个人的旅行

时间:2016-08-04 22:48:08      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:

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 #include<cstdio>
 2 #include<algorithm>
 3 #include<string.h>
 4 #define INF 0xfffffff
 5 using namespace std;
 6 int max0,map[10100][10100],flag[1010],len[1010];
 7 void f1()
 8 {
 9     int i,j;
10     memset(flag,0,sizeof(flag));                    //对标记数组清零 
11     flag[0]=1;
12     for(i = 1 ; i <= max0 ; i++)
13     {
14         len[i]=map[0][i];                            //len[i]表示0节点到i节点的距离 
15     }
16     for(i = 0 ; i < max0 ; i++)
17     {
18         int M=INF,k=-1;
19         for(j = 1 ; j <= max0 ; j++)
20         {
21             if(!flag[j] && len[j] < M)
22             {
23                 M=len[j];                            //找出距离0节点最近的点 
24                 k=j;
25             }
26         }
27         flag[k]=1;
28         for(j = 1 ; j <= max0 ; j++)
29         {
30             if(!flag[j] && len[j] > len[k]+map[k][j])
31             {
32                 len[j]=len[k]+map[k][j];            //比较0节点到j节点的距离与0节点到k节点再到j节点的距离记录小的值 
33             }
34         }
35     }
36 }
37 int main()
38 {
39     int t,s,d,i,j,x,a,b,c;
40     while(scanf("%d %d %d",&t,&s,&d)!=EOF)
41     {
42         for(i = 0 ; i <= 1001 ; i++)            //i的范围可能大于1000,所以上限要大于1000     
43         {
44             for(j = 0 ; j <= 1001 ; j++)
45             {
46                 map[i][j]=INF;                    //初始i到j的距离 
47             }
48         }
49         max0=0;
50         for(i = 0 ; i < t ; i++)                //输入城市的关系 
51         {
52             scanf("%d %d %d",&a,&b,&c);
53             if(map[a][b] > c)
54             {
55                 map[a][b]=map[b][a]=c;
56             }
57             max0=max(max0,max(a,b));            //记录最大的城市号 
58         }
59         max0++;
60         for(i = 0 ; i < s ; i++)
61         {
62             scanf("%d",&x);
63             map[0][x]=0;                        //令0为起点,起点到邻近城市的距离设为0 
64         }
65         for(i = 0 ; i < d ; i++)
66         {
67             scanf("%d",&x);
68             map[x][max0]=0;                        //令max0为终点,终点到想去的城市距离为0 
69         }
70         f1();
71         printf("%d\n",len[max0]);
72     }
73 
74  } 

 

杭电 2066 一个人的旅行

标签:

原文地址:http://www.cnblogs.com/yexiaozi/p/5738465.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!