Submission #887237

#TimeUsernameProblemLanguageResultExecution timeMemory
887237vjudge1Cities (BOI16_cities)C++17
0 / 100
113 ms24180 KiB
#include<bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")

using namespace std;
using ll = long long;
using pii = pair<int,int>;
using pll = pair<ll,ll>;

#define pb              push_back
#define F               first
#define S               second
#define len(x)          (int)x.size()
#define all(x)          x.begin(),x.end()
#define file            freopen("txt.in", "r", stdin);freopen("txt.out", "w", stdout);
#define kill(x)         {cout << x << '\n'; return 0;}
#define int             long long

const int maxn = 1e5 + 5, LG = 21, MOD = 1e9+7;// 998244353
const ll inf =  1061109567;

int n, k, m, p[maxn], sz[maxn], ans;
vector<pair<int, pii>> edges;
vector<pii> g[maxn], mst[maxn];
vector<int> cities;
bitset<maxn> mark, c, exist;

int root(int v) {
    if(p[v] == v) return v;
    return p[v] = root(p[v]);
}

inline void mrg(int v, int u) {
    v = root(v), u = root(u);
    if(v == u) return;
    if(sz[u] > sz[v]) swap(v, u);
    sz[v] += sz[u];
    p[u] = v;
}

void DFS(int v, int parent){
    mark[v] = 1;
    for(auto u : mst[v]) {
        if(parent ^ u.F && !mark[u.F]) {
            ans += u.S;
            DFS(u.F, v);
        }
    }
}


void dfs(int v, int parent = -1) {
    //cerr << "currently is vertex : " << v << ' ' << parent << '\n';
    for(auto u : mst[v]) {
        if(u.F ^ parent) {
            dfs(u.F, v);
            if(exist[u.F]) {
                ans += u.S;
                DFS(u.F, v);
                exist[v] = 1;
            }
        }
    }
    if(c[v] && parent != -1) {
        exist[v] = 1;
      //  cerr << "EXIST \n";
    }
}

inline void prep_and_input() {
    cin >> n >> k >> m;
    for(int i = 0; i < k; ++i) {
        int x;
        cin >> x;
        cities.pb(x);
        c[x] = 1;
    }
    for(int i = 1; i <= n; ++i) sz[i] = 1, p[i] = i;
    for(int i = 0; i < m; ++i) {
        int v, u, w;
        cin >> v >> u >> w;
        g[v].pb({u, w});
        g[u].pb({v, w});
        edges.pb({w,{v, u}});
    }
}

inline void MST() {
    sort(all(edges));    
    for(int i = 0; i < len(edges); ++i) {
        int v = edges[i].S.F; int u = edges[i].S.S; int w = edges[i].F;
        if(root(v) == root(u)) continue;
        else {
            mrg(v, u);
            mst[v].pb({u,w});
            mst[u].pb({v, w});
        }
    }
}

inline void solve(){
    int v = cities.back();
    dfs(v);
    cout << ans;
}

signed main() { 
    ios::sync_with_stdio(0), cin.tie(0);
    prep_and_input();
    MST();
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...