HUD 2066 一个人的旅行

题意:中文题→ _→ 

注意a,b 之间可能有多条路,一发wa就是因为没注意到

题解:没什么好说的,就是裸的最短路,dijkstra搞定

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int inf=0x3f3f3f3f;
 4 int mm[1010][1010];
 5 int vis[1010],dis[1010];
 6 int t,s,d;
 7 int maxn;
 8 void init()
 9 {
10     memset(mm,0x3f,sizeof(mm));
11     memset(dis,0x3f,sizeof(dis));
12     memset(vis,0,sizeof(vis));
13 }
14 void dijkstra(int s)
15 {
16     dis[s]=0;
17     int minn,pos;
18     for(int i=0;i<=maxn;i++)
19     {
20         minn=inf;
21         for(int j=0;j<=maxn;j++)
22         {
23             if(!vis[j]&&dis[j]<minn)
24             {
25                 minn=dis[j];
26                 pos=j;
27             }
28         }
29         vis[pos]=1;
30         for(int j=0;j<=maxn;j++)
31         {
32             if(dis[pos]+mm[pos][j]<dis[j])
33                 dis[j]=dis[pos]+mm[pos][j];
34         }
35     }
36 }
37 int main()
38 {
39     while(~scanf("%d%d%d",&t,&s,&d))
40     {
41         init();
42         int a,b,c;
43         maxn=0;
44         while(t--)
45         {
46             scanf("%d%d%d",&a,&b,&c);
47             maxn=max(maxn,max(a,b));
48             if(c<mm[a][b])
49                 mm[a][b]=mm[b][a]=c;
50         }
51         while(s--)
52         {
53             scanf("%d",&b);
54             mm[0][b]=mm[b][0]=0;
55         }
56         dijkstra(0);
57         int ans=inf;
58         while(d--)
59         {
60             scanf("%d",&c);
61             ans=min(ans,dis[c]);
62         }
63         printf("%d\n",ans);
64     }
65 }

 

posted @ 2017-10-08 23:11  Kearon  阅读(205)  评论(0编辑  收藏  举报