HDU2066(SPFA+前向星)
https://vjudge.net/problem/HDU-2066
虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^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<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<algorithm> 5 #include<cmath> 6 #include<vector> 7 #include<queue> 8 #define ms(x,n) memset(x,n,sizeof x); 9 const int maxn=2010;//1010 10 const int inf=0x3f3f3f3f; 11 using namespace std; 12 int n,m,cnt; 13 int head[maxn],vis[maxn],d[maxn]; 14 struct edge 15 { 16 int to,w,next; 17 edge(){} 18 edge(int tt,int ww,int ne){to=tt,w=ww,next=ne;} 19 }e[maxn]; 20 void add(int u,int v,int w) 21 {//注意输入的是无向图; 22 e[cnt]=edge(v,w,head[u]); 23 head[u]=cnt++; 24 e[cnt]=edge(u,w,head[v]); 25 head[v]=cnt++; 26 } 27 int spfa(int s,int n)//起始点,终点 28 { 29 int u,v; 30 queue<int>q; 31 memset(vis,0,sizeof vis); 32 memset(d,0x3f,sizeof d); 33 while(!q.empty())q.pop(); 34 d[s]=0,vis[s]=1; 35 q.push(s); 36 while(!q.empty()) 37 { 38 u=q.front(); 39 q.pop(); 40 vis[u]=0; 41 for(int i=head[u];~i;i=e[i].next) 42 { 43 v=e[i].to; 44 if(d[v]>d[u]+e[i].w) 45 { 46 d[v]=d[u]+e[i].w; 47 if(!vis[i]) 48 { 49 vis[v]=1; 50 q.push(v); 51 } 52 } 53 } 54 } 55 return d[n]; 56 } 57 int main() 58 { 59 int t,s,d; 60 while(~scanf("%d%d%d",&t,&s,&d)) 61 { 62 memset(head,-1,sizeof head); 63 cnt=0; 64 for(int i=1;i<=t;i++) 65 { 66 int x,y,w; 67 scanf("%d%d%d",&x,&y,&w); 68 add(x,y,w); 69 } 70 int m[maxn];//相邻城市 71 for(int i=1;i<=s;i++) 72 scanf("%d",&m[i]); 73 int ans=inf; 74 for(int i=1;i<=d;i++) 75 { 76 int want;//想去城市 77 scanf("%d",&want); 78 for(int j=1;j<=s;j++) 79 ans=min(ans,spfa(m[j],want));//注意下标 80 } 81 printf("%d\n",ans); 82 } 83 return 0; 84 }