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; }
|
近期评论