hdu

来源:互联网 发布:apache 目录访问控制 编辑:程序博客网 时间:2024/04/27 22:25

ProblemDescription

虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^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

输出草儿能去某个喜欢的城市的最短时间。

SampleInput

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

SampleOutput

9

题目大意:

在一个城市里,有很多的站点,草儿想从家里到这些站点中的某些站点,有几个站点里草儿家比较近,她会考虑先到这几个站点,再到其他站点,最终到达她想要去的站点,问,在她达到的站点中,哪个站点她用时最少。

这是一道求两个点的最短路径问题,即:寻找单源最短路径问题,利用dijkstra算法求解,代码如下:

#include <stdio.h>

#define M 1000000

int cost[1000][1000] ;

int max(int a, int b)

{

       if(b > a)

              returnb ;

       return a ;

}

 

int dijkstra(int n)

{

       int i, j, d,min, visit[1000], dist[1000] ;

       for(i = 0; i<= n; i++)

              dist[i]= cost[0][i] ;

       memset(visit,0, sizeof(visit)) ;

       visit[0] = 1;

       for(i = 0; i< n; i++)

       {

              min =M ;

              for(j= 0; j <= n; j++)

              {

                    if(!visit[j]&& dist[j] < min)

                    {

                           min= dist[j] ;

                           d= j ;

                    }

              }

              visit[d]= 1 ;

              for(j= 0; j <= n; j++)

              {

                    if(!visit[j]&& dist[d] + cost[d][j] < dist[j])

                           dist[j]= dist[d] + cost[d][j] ;

              }

       }

       returndist[n] ;

}

 

int main()

{

       int t, s, d,i, j, a, b, end, time, ss[1000], dd[1000] ;

       while(scanf("%d%d %d", &t, &s, &d) != EOF)

       {

              end =0 ;

              for(i= 0; i < 1000; i++)

              {

                    for(j= 0; j < 1000; j++)

                           cost[j][i]= cost[i][j] = M ;

              }

              for(i= 1; i <= t; i++)

              {

                    scanf("%d%d %d", &a, &b, &time) ;

                    if(cost[a][b]== 0)

                           cost[a][b]= cost[b][a] = time ;

                    elseif(time < cost[a][b])

                           cost[a][b]= cost[b][a] = time ;

                    if(end< max(a, b))

                           end= max(a, b) ;

              }

              for(i= 1; i <= s; i++)

              {

                    scanf("%d",&ss[i]) ;

                    cost[0][ss[i]]= 1 ;

                    cost[ss[i]][0]= 1 ;

              }

              end++;

              for(i= 1; i <= d; i++)

              {

                    scanf("%d",&dd[i]) ;

                    cost[end][dd[i]]= 1 ;

                    cost[dd[i]][end]= 1 ;

              }

              printf("%d\n",dijkstra(end)-2) ;

       }

       return 0 ;

}

Dijkstra算法是用来查找单源最短路径问题的,即一个点到达另一个点的最短路径,但这个题目寻找的是部分点到达部分点的最短路径,比如寻找3个点到达另外4个点的最短距离,我们可以遍历起始的3个点,当然,我们也可以给这些点的集合中加两个点,起始点0和终止点end,定义0点距离草儿家近的点的距离为1,end点距离她想要到达的点的距离为1,然后通过dijkstra直接寻找0点到end的最短距离即可。

0 0