Submission #1223217

#TimeUsernameProblemLanguageResultExecution timeMemory
1223217BestCrazyNoobToll (APIO13_toll)C++20
0 / 100
0 ms324 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>

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

struct DSU {
    vector<int> p, s;
    DSU(int N) {
        s.resize(N, 1);
        p.resize(N);
        for (int i = 0; i < N; i++) p[i] = i;
    }
    int repr(int a) {
        while (p[a] != a) a = p[a];
        return a;
    }
    bool join(int a, int b) {
        a = repr(a);
        b = repr(b);
        if (a == b) return false;
        if (s[a] < s[b]) swap(a, b);
        s[a] += s[b];
        p[b] = a;
        return true;
    }
};

struct Edge {
    int i, j, w;
};

int N, M, K;
vector<vector<pii>> tree;
vector<int> P;
ll res = 0;

bool setup(int curr, int prev, int tar, int w) {
    if (curr == tar) return true;
    for (auto &[c, cw]: tree[curr]) {
        if (c == prev) continue;
        if (setup(c, curr, tar, w)) {
            if (cw == -1) cw = w;
            return true;
        }
    }
    return false;
}

ll eval(int curr, int prev) {
    ll up = P[curr];
    for (auto [c, w]: tree[curr]) {
        if (c == prev) continue;
        const ll upc = eval(c, curr);
        res += w * upc;
        up += upc;
    }
    return up;
}

int main() {
    cin >> N >> M >> K;
    vector<Edge> edges(M);
    for (Edge &e: edges) {
        cin >> e.i >> e.j >> e.w;
        e.i--; e.j--;
    }
    vector<pii> add(K);
    for (pii &e: add) {
        cin >> e.first >> e.second;
        e.first--; e.second--;
    }
    P.resize(N);
    for (int &x: P) cin >> x;
    
    sort(edges.begin(), edges.end(), [](Edge a, Edge b) {return a.w < b.w;});

    ll ans = 0;

    for (int mask = 0; mask < (1 << K); mask++) {
        tree.clear();
        tree.resize(N);
        int edgeCnt = 0;
        bool cycle = false;
        for (int h = 0; h < K; h++) {
            if (((mask >> h) & 1)) {
                if (setup(add[h].first, -1, add[h].second, -1)) {
                    cycle = true;
                    break;
                }
                tree[add[h].first].push_back({add[h].second, -1});
                tree[add[h].second].push_back({add[h].first, -1});
                edgeCnt++;
            }
        }

        if (cycle) continue;

        for (Edge e: edges) {
            if (!setup(e.i, -1, e.j, e.w)) {
                edgeCnt++;
                tree[e.i].push_back({e.j, 0});
                tree[e.j].push_back({e.i, 0});
            }
        }

        res = 0;
        eval(0, -1);
        ans = max(ans, res);
    }

    cout << ans << '\n';

    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...