Submission #1245772

#TimeUsernameProblemLanguageResultExecution timeMemory
1245772baotoan655Cities (BOI16_cities)C++20
74 / 100
6095 ms165356 KiB
#include <bits/stdc++.h>
#define file(name)  if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
#define ll long long
#define fi first
#define se second
using namespace std;

const int N = 1e5 + 5;
int n, m, k;
vector<pair<int, int>> g[N];
ll d[N][1 << 5];
int tt[N];
struct state {
    int u, mask;
    ll w;
    bool operator < (const state &o) const {
        return w > o.w;
    }
};
void solve(int tc) {
    cin >> n >> k >> m;
    for(int i = 0; i < k; ++i) {
        int x;
        cin >> x;
        tt[x] = (1 << i);
    }
    for(int i = 1; i <= m; ++i) {
        int u, v, c;
        cin >> u >> v >> c;
        g[u].emplace_back(v, c);
        g[v].emplace_back(u, c);
    }
    memset(d, 0x3f, sizeof d);
    priority_queue<state> pq;
    for(int i = 1; i <= n; ++i) {
        d[i][tt[i]] = 0;
        pq.push({i, tt[i], 0});
    }
     while(!pq.empty()) {
        auto [u, mask, kc] = pq.top();
        pq.pop();
        if(d[u][mask] != kc) continue;
        for(auto [v, c] : g[u]) {
            int newMask = mask | tt[v];
            if(d[v][newMask] > d[u][mask] + c) {
                d[v][newMask] = d[u][mask] + c;
                pq.push({v, newMask, d[v][newMask]});
            }
        }
        for(int pre = 0; pre < (1 << k); ++pre) {
            int newMask = pre | mask;
            if(d[u][newMask] > d[u][mask] + d[u][pre]) {
                d[u][newMask] = d[u][mask] + d[u][pre];
                pq.push({u, newMask, d[u][newMask]});
            }
        }
    }
    ll ans = 1e16;
    for(int i = 1; i <= n; ++i) {
        ans = min(ans, d[i][(1 << k) - 1]);
    }
    cout << ans << '\n';
    return;
}
int32_t main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
//    file("A") else file("task");
    int tc = 1;
//     cin >> tc;
    for(int i = 1; i <= tc; ++i) solve(i);
    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...