HDU 一个人的旅行(Dijkstra)

来源:互联网 发布:守望先锋各个性能数据 编辑:程序博客网 时间:2024/06/17 01:29
B - 一个人的旅行
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit Status

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 31 3 51 4 72 8 123 8 44 9 129 10 21 28 9 10
 

Sample Output

9
#include <iostream>#include <stdlib.h>#include <stdio.h>#include <string.h>#define MAX 9999999using namespace std;int t,s,d;int rr;int a[1001][1001],v[1000001],b[1000001];int p[1000001],q[1000001];int Dijkstra(int n){    int i,j,k;    memset(b,0,sizeof(b));    for(i=0;i<1000001;i++)     v[i]=MAX;     for(i=0;i<=rr;i++)        v[i]=a[n][i];     v[n]=0;     b[n]=1;     int min2=MAX;     for(i=1;i<rr;i++)     {         min2=MAX;         for(j=1;j<=rr;j++)         {             if(!b[j]&&min2>v[j])             {                 min2=v[j];                 k=j;             }         }           b[k]=1;         for(j=1;j<=rr;j++)         {             if(!b[j]&&v[j]>v[k]+a[k][j])                v[j]=v[k]+a[k][j];         }     }     int sum=MAX;     for(i=0;i<d;i++)       {           if(sum>v[q[i]])            sum=v[q[i]];       }     return sum;}int main(){    int i,j;    while(~scanf("%d%d%d",&t,&s,&d))    {        for(i=0;i<1001;i++)        {            for(j=0;j<1001;j++)            {                a[i][j]=a[j][i]=MAX;            }            a[i][i]=0;        }        int x,y,m;        rr=0;        int dd=0;        for(i=0;i<t;i++)        {            scanf("%d%d%d",&x,&y,&m);            if(a[x][y]>m)            {                a[x][y]=a[y][x]=m;            }            if(x>y)                dd=x;            else dd=y;            if(dd>rr)                rr=dd;        }        for(i=0;i<s;i++)            scanf("%d",&p[i]);        for(i=0;i<d;i++)          scanf("%d",&q[i]);        int min1=MAX;        for(i=0;i<s;i++)        {        int w=Dijkstra(p[i]);            if(min1>w)                min1=w;        }        printf("%d\n",min1);    }    return 0;}

0 0