hdu 2066

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const int inf = 1<<30;
 6 int map1[1005][1005];
 7 int T, S, D, n=0;
 8 int d[1005];
 9 bool vis[1005];
10 int a[1005];
11 void dij(int x)
12 {
13     for(int i=0; i<=n; i++)
14     {
15         d[i]=map1[0][i];
16     }
17     memset(vis, 0, sizeof(vis));
18     vis[0]=1;
19     for(int i=1; i<=n; i++)
20     {
21         int u, mini=inf;
22         for(int j=1; j<=n; j++)
23         {
24             if(!vis[j]&&d[j]<mini)
25             {
26                 mini=d[j];
27                 u=j;
28             }
29         }
30         vis[u]=1;
31         for(int v=1; v<=n; v++)
32         {
33             if(!vis[v]) d[v]=min(d[v], d[u]+map1[u][v]);
34         }
35     }
36 }
37 int main()
38 {
39     while(scanf("%d%d%d", &T, &S, &D)!=EOF)
40     {
41         for(int i=0; i<1005; i++)
42         {
43             for(int j=0; j<1005; j++)
44             {
45                 map1[i][j]=(i==j?0:inf);
46             }
47         }
48         for(int i=0; i<T; i++)
49         {
50             int x, y, z;
51             scanf("%d %d %d", &x, &y, &z);
52             n=max(max(x, y), n);
53             if(z<map1[x][y]) map1[x][y]=map1[y][x]=z;
54         }
55         for(int i=0; i<S; i++)
56         {
57             int x;
58             scanf("%d", &x);
59             n=max(n, x);
60             map1[x][0]=map1[0][x]=0;
61         }
62         for(int i=0; i<D; i++)
63         {
64             scanf("%d", &a[i]);
65         }
66         dij(0);
67         int x=inf;
68         for(int i=0; i<D; i++)
69         {
70             x=min(x, d[a[i]]);
71         }
72         cout <<x<<endl;
73         n=0;
74     }
75 
76     return 0;
77 }

 

posted @ 2017-06-01 20:28  aowu~  阅读(119)  评论(0)    收藏  举报