Submission #1292010

#TimeUsernameProblemLanguageResultExecution timeMemory
1292010dostsToll (APIO13_toll)C++20
16 / 100
2 ms1088 KiB
#include <bits/stdc++.h>
#ifdef Dodi
#include "/home/dodi/Desktop/ATC/ARC/arc156/debug.h"
#else
#define debug(...) void(42)
#endif
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
#define int long long
#define pii pair<int,int>
#define vi vector<int>
#define ff first
#define ss second
#define sp << " " <<
#define all(x) x.begin(),x.end()
#define big(x) ((int)(x.size()))
using namespace std;
const int MOD = 1e9+7, LIM = 1e6+1, inf = 2e18;

const int N = 1e5+1;


struct DSU {
    vi dad,sz;
    int n;
    DSU(int nn) {
        n = nn;
        dad.resize(nn+1);
        sz.assign(nn+1,1);
        iota(all(dad),0ll);
    }
    int find(int x) {
        if (x == dad[x]) return x;
        return dad[x] = find(dad[x]);
    }

    void unite(int x,int y) {
        int a = find(x),b = find(y);
        if (a == b) return;
        if (sz[a] > sz[b]) swap(a,b);
        sz[b]+=sz[a];
        dad[a] = b;
    }

    void reset() {
        iota(all(dad),0ll);
        sz.assign(n+1,1);
    }
};

vector<pii> final[N];
vi people(N,0);

pii dfs(int node,int p) {
    int ans = 0,many = people[node];
    for (auto it : final[node]){
        if (it.ff == p) continue;
        pii pr = dfs(it.ff,node);
        ans+=it.ss*pr.ss;
        ans+=pr.ff;
        many+=pr.ss;
    }
    return {ans,many};
}

void solve() {
    int n,m,k;
    cin >> n >> m >> k;
    vector<pair<int,pii>> edges;
    vector<pii> my_edges;
    vi value(k);
    for (int i=1;i<=m;i++) {
        int a,b,c;
        cin >> a >> b >> c;
        edges.push_back({c,{a,b}});
    }
    for (int i=1;i<=k;i++) {
        int a,b;
        cin >> a >> b;
        my_edges.push_back({a,b});
    }
    vi vals(n+1);
    for (int i=1;i<=n;i++) cin >> vals[i];
    sort(all(edges));
    DSU dsu(n),dsu2(n);
    for (auto [cost,con] : edges) {
        auto [a,b] = con;
        if (dsu.find(a) == dsu.find(b)) continue;
        int fl = 0;
        int ctr = -1;
        for (auto it : my_edges) {
            ++ctr;
            if (dsu.find(it.ff) == dsu.find(it.ss)) continue;
            int u = dsu.find(it.ff), v = dsu.find(it.ss);
            if (set<int>{dsu.find(a),dsu.find(b)} == set<int>{u,v}) {
                value[ctr] = cost;
                fl = 1;
            }
        }
        if (!fl) dsu2.unite(a,b),dsu.unite(a,b);
        else dsu.unite(a,b);
    }
    vi roots;
    for (int i=1;i<=n;i++) roots.push_back(dsu2.find(i));
    sort(all(roots));
    roots.erase(unique(all(roots)),roots.end());
    vi id(n+1);
    for (int i=1;i<=n;i++) {
        id[i] = upper_bound(all(roots),dsu2.find(i))-roots.begin();
        people[id[i]]+=vals[i];
    }
    DSU dsu3(big(roots));
    int lim = (1<<k);
    int ans = 0;
    for (int i = 0;i<lim;i++) {
        dsu3.reset();
        for (int j = 1;j<=big(roots);j++) final[j].clear();
        for (int j = 0;j<k;j++) {
            if (!(i&(1<<j))) continue;
            if (dsu3.find(id[my_edges[j].ff]) != dsu3.find(id[my_edges[j].ss])) {
                final[id[my_edges[j].ff]].push_back({id[my_edges[j].ss],value[j]});
                final[id[my_edges[j].ss]].push_back({id[my_edges[j].ff],value[j]});
                dsu3.unite(id[my_edges[j].ff],id[my_edges[j].ss]);
            }
        }
        if (dsu3.sz[dsu3.find(1)] != big(roots)) continue;
        ans = max(ans,dfs(id[1],id[1]).ff);
    }
    cout << ans << '\n';
} 

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    #ifdef Dodi
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
    #endif
    int t = 1;
    //cin >> t;
    while (t --> 0) 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...