HDU 2066 dijkstra 最短路径

C - 一个人的旅行
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 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
 有重边!
ACcode:
#pragma warning(disable:4786)//使命名长度不受限制
#pragma comment(linker, "/STACK:102400000,102400000")//手工开栈
#include <map>
#include <set>
#include <queue>
#include <cmath>
#include <stack>
#include <cctype>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define rd(x) scanf("%d",&x)
#define rd2(x,y) scanf("%d%d",&x,&y)
#define rds(x) scanf("%s",x)
#define rdc(x) scanf("%c",&x)
#define ll long long int
#define maxn 1111
#define mod 1000000007
#define INF 0x3f3f3f3f //int 最大值
#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;++i)
#define MT(x,i) memset(x,i,sizeof(x))
#define PI  acos(-1.0)
#define E  exp(1)
using namespace std;
bool vis[maxn];
int pre[maxn],cost[maxn][maxn],lowcost[maxn],aa[maxn],bb[maxn];
void  dijkstra(int n,int beg){
    FOR(i,0,n){lowcost[i]=INF;vis[i]=false;pre[i]=-1;}
    lowcost[beg]=0;
    FOR(j,1,n){
        int k=-1;int min=INF;
        FOR(i,1,n)
            if(!vis[i]&&lowcost[i]<min){
                min=lowcost[i];
                k=i;
            }
        if(k==-1)break;
        vis[k]=true;
        FOR(i,1,n)
            if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i]){
                lowcost[i]=lowcost[k]+cost[k][i];
                pre[i]=k;
            }
    }
}
int t,s,d,a,b,c,ans,n;
int main(){
    while(scanf("%d%d%d",&t,&s,&d)!=EOF){
        MT(cost,INF);n=-INF;
        FOR(i,1,t){
            rd2(a,b);rd(c);
            if(c<cost[a][b])
                cost[a][b]=cost[b][a]=c;
            n=max(max(a,b),n);
        }
        FOR(i,1,s)rd(aa[i]);
        FOR(i,1,d)rd(bb[i]);
        ans=INF;
        FOR(i,1,s){
            dijkstra(n,aa[i]);
            FOR(i,1,d)ans=min(ans,lowcost[bb[i]]);
        }
        printf("%d\n",ans);
    }
    return 0;
}
/*
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
*/


你可能感兴趣的:(C++,图论,HDU,dijkstra)