# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1162540 | CrabCNH | Cities (BOI16_cities) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#define task "BriantheCrab"
#define int long long
#define pii pair <int, int>
#define fi first
#define se second
#define szf sizeof
#define sz(s) (int)((s).size())
using namespace std;
template <class T> void mini (T &t, T f) {if (t > f) t = f;}
template <class T> void maxi (T &t, T f) {if (t < f) t = f;}
const int maxN = 2e5 + 5;
const int inf = 1e18 + 7;
const int mod = 1e9 + 7;
struct Edge {
int u, w, s;
};
struct cmp {
bool operator () (Edge A, Edge B) {
return A.w > B.w;
}
};
struct Path {
int u, v, w;
};
int n, m, k;
int par[maxN], sz[maxN], curS[maxN];
map <pii, int> ck;
bool mp[maxN];
vector <int> spe;
vector <pii> adj[maxN];
vector <Path> all, nAll;
pii L[maxN]; // dis, source
bool cmpEdge (Path A, Path B) {
return A.w < B.w;
}
void init () {
for (int i = 1; i <= n; i ++) {
par[i] = i;
sz[i] = 1;
curS[i] = mp[i];
}
}
int getRoot (int u) {
if (par[u] == u) {
return u;
}
return (par[u] = getRoot (par[u]));
}
void merge (int u, int v) {
u = getRoot (u);
v = getRoot (v);
if (u == v) {
return;
}
if (sz[u] < sz[v]) {
swap (u, v);
}
par[v] = u;
sz[u] += sz[v];
curS[u] += curS[v];
}
void multiSources () {
priority_queue <Edge, vector <Edge>, cmp> pq;
for (int i = 1; i <= n; i ++) {
L[i] = {inf, -1};
}
for (auto u : spe) {
L[u] = {0, u};
pq.push ({u, L[u].fi, u});
}
while (!pq.empty ()) {
auto [u, c, source] = pq.top ();
pq.pop ();
if (c > L[u].fi) {
continue;
}
for (auto [v, dis] : adj[u]) {
if (L[v].fi > L[u].fi + dis) {
L[v] = {L[u].fi + dis, L[u].se};
pq.push ({v, L[v].fi, L[v].se});
}
}
}
}
void solve () {
cin >> n >> k >> m;
for (int i = 1; i <= k; i ++) {
int x;
cin >> x;
spe.push_back (x);
mp[x] ++;
}
for (int i = 1; i <= m; i ++) {
int u, v, w;
cin >> u >> v >> w;
if (ck.find ({u, v}) == ck.end ()) {
ck[{u, v}] = w;
}
else {
mini (ck[{u, v}], w);
}
w = ck[{u, v}];
adj[u].push_back ({v, w});
adj[v].push_back ({u, w});
all.push_back ({u, v, w});
}
multiSources ();
for (auto [u, v, w] : all) {
nAll.push_back ({u, L[v].se, w + L[v].fi});
nAll.push_back ({L[u].se, v, L[u].fi + w});
//cout << L[u].se << ' ' << L[v].se << ' ' << L[u].fi + w + L[v].fi << '\n';
}
init ();
sort (nAll.begin (), nAll.end (), cmpEdge);
int cnt = 0, res = 0;
//cout << getRoot (1) << ' ' << getRoot (2) << '\n';
for (auto [u, v, w] : nAll) {
//cout << u << ' ' << v << ' ' << w << '\n';
if (getRoot (u) == getRoot (v)) {
continue;
}
merge (u, v);
res += w;
int rt = getRoot (u);
if (curS[rt] == k) {
break;
}
}
cout << res;
return;
}
signed main () {
cin.tie (nullptr) -> sync_with_stdio (false);
if (fopen (task".inp", "r")) {
freopen (task".inp", "r", stdin);
freopen (task".out", "w", stdout);
}
int t = 1;
//cin >> t;
while (t --) {
solve ();
}
return 0;
}
// thfdgb