HDU 2066 dijkstra 最短路径

来源:互联网 发布:java snmp 编辑:程序博客网 时间:2024/06/01 07:58
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 31 3 51 4 72 8 123 8 44 9 129 10 21 28 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 31 3 51 4 72 8 123 8 44 9 129 10 21 28 9 10*/


0 0
原创粉丝点击