Submission #1166133

#TimeUsernameProblemLanguageResultExecution timeMemory
1166133ALTAKEXEToll (APIO13_toll)C++20
56 / 100
2592 ms12708 KiB
#include <bits/stdc++.h>
#define ll long long
#define ff first
#define ss second
#define pii pair<int,int>
#define pb push_back
#define eb emplace_back
#define inf INT_MAX
#define all(x) x.begin(),x.end()
const int MOD = 1e9+7;
using namespace std;
ll n, m, k, an;
vector<int> p, a, h;
vector<vector<pair<int,int>>> v;
vector<pair<int,int>> blue;
void budah(vector <int> &p) {
    p.resize(n+1);
    for(int i = 1; i <= n; i++) {
        p[i] = i;
    }
}
int ol(int x) {
    if(p[x] == x) return p[x];
    return p[x] = ol(p[x]);
}

void dfs(int x, int y) {
    h[x] = h[y] + 1;
    for(auto i : v[x]) {
        if(i.ff != y) dfs(i.ff, x);
    }
}

void upd(int a1, int b1, int w) {
    h.assign(n+1, 0);
    dfs(1, 0);
    if(h[b1] > h[a1]) swap(b1, a1);
    int x = a1, y = b1;
    while(h[a1] > h[b1]) {
        for(auto &i : v[a1]) {
            if(i.ff == x) i.ss = min(i.ss, w);
        }
        x = a1;
        for(auto i : v[a1]) {
            if(h[i.ff] < h[a1]) {
                a1 = i.ff;
                break;
            }
        }
    }
    while(a1 != b1) {
        for(auto &i : v[a1]) {
            if(i.ff == x) i.ss = min(i.ss, w);
        }
        for(auto &i : v[b1]) {
            if(i.ff == y) i.ss = min(i.ss, w);
        }
        x = a1, y = b1;
        for(auto i : v[a1]) {
            if(h[i.ff] < h[a1]) {
                a1 = i.ff;
                break;
            }
        }
        for(auto i : v[b1]) {
            if(h[i.ff] < h[b1]) {
                b1 = i.ff;
                break;
            }
        }
    }
    for(auto &i : v[b1]) {
        if(i.ff == x or i.ff == y) i.ss = min(i.ss, w);
    }
}

void f(int x, int y, ll w) {
    an += (w * a[x]);
    for(auto i : v[x]) {
        if(i.ff == y) continue;
        f(i.ff, x, w + i.ss);
    }
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(nullptr);
    cin>>n>>m>>k;
    vector<pair<int,pair<int, int>>> vc, vc1; 
    for(int i = 1; i <= m; i++) {
        int u1, u2, c;
        cin >> u1 >> u2 >> c;
        vc.pb({c, {u1, u2}});
    }
    sort(vc.begin(), vc.end());
    budah(p);

    for(int i = 0; i < m; i++) {
        int a1 = ol(vc[i].ss.ff), b1 = ol(vc[i].ss.ss);
        if(a1 == b1) continue;
        p[b1] = a1;
        vc1.pb(vc[i]);
    }
    vc = vc1;

    blue.resize(k);
    for(int i = 0; i < k; i++) {
        cin >> blue[i].ff >> blue[i].ss;
    }

    a.resize(n+1);
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
    }

    ll ans = 0;
    for(int mask = 0; mask < (1<<k); mask++) {
        budah(p);
        bool tr = 0;
        v.clear();
        v.resize(n+1);
        for(int i = 0; i < k; i++) {
            if((mask>>i)&1) {
                int a1 = ol(blue[i].ff), b1 = ol(blue[i].ss);
                if(a1 == b1) {
                    tr = 1;
                    break;
                }
                p[b1] = a1;
                v[blue[i].ff].pb({blue[i].ss, 1e9});
                v[blue[i].ss].pb({blue[i].ff, 1e9});
            }
        }
        if(tr) continue;
        vector <int> t(n+1, 0);
        for(int i = 0; i < vc.size(); i++) {
            int a1 = ol(vc[i].ss.ff), b1 = ol(vc[i].ss.ss);
            if(a1 != b1) {
                p[b1] = a1;
                v[vc[i].ss.ff].pb({vc[i].ss.ss, 0});
                v[vc[i].ss.ss].pb({vc[i].ss.ff, 0});
            }
            else {
                t[i] = true;
            }
        }
        for(int i = 0; i < vc.size(); i++) {
            if(!t[i]) continue;
            upd(vc[i].ss.ff, vc[i].ss.ss, vc[i].ff);
        }
        an = 0;
        f(1, 0, 0);
        ans = max(ans, an);
    }
    cout << ans;
    return 0;
}
#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...