Submission #1281075

#TimeUsernameProblemLanguageResultExecution timeMemory
1281075Canuc80kCities (BOI16_cities)C++20
0 / 100
6095 ms37944 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const ll N = 1e5 + 1;

ll n, k, m;
ll a[N], f[(1ll << 5)][N];
vector<array<ll, 2>> g[N];

int main() {
    ios_base::sync_with_stdio(0), cin.tie(0);

    cin >> n >> k >> m;
    for (int i = 1; i <= k; i ++) 
        cin >> a[i], a[i] --;

    for (int i = 1; i <= m; i ++) {
        ll u, v, k; cin >> u >> v >> k;
        u --; v --;
        g[u].push_back({v, k});
        g[v].push_back({u, k});
    }

    memset(f, 0x3f, sizeof f);
    for (int i = 1; i <= k; i ++) f[(1ll << (i - 1))][a[i]] = 0;
    for (int i = 0; i < n; i ++) f[0][i] = 0;
    for (int mask = 0; mask < (1ll << k); mask ++) {
        if (mask == 0) continue;
        for (int submask = mask; ; submask = (submask - 1) & mask) {
            for (int u = 0; u < n; u ++) {
                int other = mask ^ submask;
                f[mask][u] = min(f[mask][u], f[submask][u] + f[other][u]);
            }
        }

        priority_queue<array<ll, 2>, vector<array<ll, 2>>, greater<array<ll, 2>>> pq;
        for (int i = 0; i < n; i ++) if (f[mask][i] < 1e9) pq.push({f[mask][i], i});
        while (pq.size()) {
            auto [cost, u] = pq.top(); pq.pop();
            if (f[mask][u] != cost) continue;
			for (auto [v, w]: g[u]) {
                if (f[mask][v] > f[mask][u] + w) {
                    f[mask][v] = f[mask][u] + w;
                    pq.push({f[mask][v], v});
                }
            }
        }
    }

    ll res = 1e18;
    for (int i = 0; i < n; i ++) res = min(res, f[(1ll << k) - 1][i]);
    cout << res;
}
#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...