hdu-2066

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using namespace std;
const int kMaxN = 1002;
const int kINF = 0x2fffffff;
typedef pair<int, int> Pii;
int kT, kD, kS;
int kSource = 0;
int kTerminal = 1001;
int kDist[kMaxN];
struct {
int to, cost;
Edge(int t, int c) : to(t), cost(c){}
};
vector<Edge>kGraph[kMaxN];
void Addedge(int s, int e, int c){
kGraph[s].push_back(Edge(e, c));
}
int DijkStra(int s, int t){
priority_queue<Pii, vector<Pii>, greater<Pii>> pque;
fill(kDist, kDist + kMaxN, kINF);
kDist[s] = 0;
pque.push(Pii(0, s));
while(!pque.empty()){
Pii top = pque.top();
pque.pop();
int v = top.second;
if(kDist[v] < top.first)
continue;
for(uint32_t i = 0; i < kGraph[v].size(); ++i){
Edge e = kGraph[v][i];
if(kDist[e.to] > kDist[v] + e.cost){
kDist[e.to] = kDist[v] + e.cost;
pque.push(Pii(kDist[e.to], e.to));
}
}
}
return kDist[t];
}
void Init(){
for(int i = 0; i < kMaxN; ++i){
kGraph[i].clear();
}
}
int main(){
while(scanf("%d%d%d", &kT,&kS,&kD)!=EOF){
int s, t, c;
Init();
for(int i = 0; i < kT; ++i){
scanf("%d %d %d", &s, &t, &c);
Addedge(s, t, c);
Addedge(t, s, c);
}
for(int i = 0; i < kS; ++i){
scanf("%d", &s);
Addedge(kSource, s, 0);
}
for(int i = 0; i < kD; ++i){
scanf("%d", &t);
Addedge(t, kTerminal, 0);
}
printf("%dn", DijkStra(kSource, kTerminal));
}
return 0;
}