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
| struct edge { int to, cost; };
vector<int> dijkstra(const vector<vector<edge>> &g, int s) { vector<int> d(g.size() + 5, INF); priority_queue<pair<ll,ll>, vector<pair<ll,ll>>, greater<pair<ll,ll>>> que; d[s] = 0; que.emplace(0, s); while (!que.empty()) { auto p = que.top(); que.pop(); int u = p.second; if (d[u] < p.first) continue; for (auto &e : g[u]) { int v = e.to; if (d[v] > d[u] + e.cost) { d[v] = d[u] + e.cost; que.emplace(d[v], v); } } } return d; }
ll n,m,a,b,c; ll p[maxn]; vector<vector<edge>> g; void solve() { SLLA(n); SLLA(m); SLLA(a); SLLA(b); SLLA(c); g.resize(n+5); REPP(i,1,n) { g[i].clear(); } REPP(i,1,m) { SLLA(p[i]); } sort(p+1,p+m+1); REPP(i,1,m) { p[i] += p[i-1]; } REPP(i,1,m) { int h,f; SA(h); SA(f); g[h].push_back(edge{f, 1}); g[f].push_back(edge{h, 1}); }
std::vector<int> dis1 = dijkstra(g, a); std::vector<int> dis2 = dijkstra(g, b); std::vector<int> dis3 = dijkstra(g, c); ll ans = LL_INF; REPP(i,1,n) { if(dis1[i] + dis2[i] + dis3[i] > m) { continue; } ans = min(ans, p[dis1[i] + dis2[i] + dis3[i]] + p[dis2[i]]); } printf("%lld\n", ans); }
|