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 }

 

posted @ 2019-04-29 23:00  zuiaimiusi  阅读(132)  评论(0编辑  收藏  举报