Submission #1352579

#TimeUsernameProblemLanguageResultExecution timeMemory
1352579phancddevToll (APIO13_toll)C++20
0 / 100
2595 ms440 KiB
#include <bits/stdc++.h>
using namespace std;

struct Edge {
    int u, v;
    long long w;
    bool neu;
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int N, M, K;
    cin >> N >> M >> K;

    vector<Edge> oldEdges;
    vector<long long> cand;
    for (int i = 0; i < M; i++) {
        int a, b;
        long long c;
        cin >> a >> b >> c;
        oldEdges.push_back({a, b, c, false});
        cand.push_back(c);
    }

    int x, y;
    cin >> x >> y;

    vector<long long> p(N + 1);
    for (int i = 1; i <= N; i++) cin >> p[i];

    long long ans = 0;
    int E = M + 1;

    for (long long wnew : cand) {
        vector<Edge> edges = oldEdges;
        edges.push_back({x, y, wnew, true});

        long long bestCost = (1LL << 62);
        long long brr = 0;

        for (int mask = 0; mask < (1 << E); mask++) {
            if (__builtin_popcount(mask) != N - 1) continue;

            vector<vector<pair<int,int>>> g(N + 1);
            long long cost = 0;
            int newId = -1;
            int cntNew = 0;

            for (int i = 0; i < E; i++) {
                if (mask >> i & 1) {
                    cost += edges[i].w;
                    g[edges[i].u].push_back({edges[i].v, i});
                    g[edges[i].v].push_back({edges[i].u, i});
                    if (edges[i].neu) {
                        newId = i;
                        cntNew++;
                    }
                }
            }

            if (cntNew > 1) continue;

            vector<int> vis(N + 1, 0);
            queue<int> q;
            q.push(1);
            vis[1] = 1;
            int reached = 0;
            while (!q.empty()) {
                int u = q.front();
                q.pop();
                reached++;
                for (auto [v, id] : g[u]) {
                    if (!vis[v]) {
                        vis[v] = 1;
                        q.push(v);
                    }
                }
            }

            if (reached != N) continue;

            long long revenue = 0;
            if (newId != -1) {
                vector<int> vis2(N + 1, 0);
                queue<int> q2;
                q2.push(1);
                vis2[1] = 1;
                while (!q2.empty()) {
                    int u = q2.front();
                    q2.pop();
                    for (auto [v, id] : g[u]) {
                        if (id == newId) continue;
                        if (!vis2[v]) {
                            vis2[v] = 1;
                            q2.push(v);
                        }
                    }
                }
                long long flow = 0;
                for (int i = 1; i <= N; i++) {
                    if (!vis2[i]) flow += p[i];
                }
                revenue = flow * wnew;
            }

            if (cost < bestCost) {
                bestCost = cost;
                brr = revenue;
            } else if (cost == bestCost) {
                brr = max(brr, revenue);
            }
        }

        ans = max(ans, brr);
    }

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