제출 #1185535

#제출 시각아이디문제언어결과실행 시간메모리
1185535qwushaCities (BOI16_cities)C++20
14 / 100
975 ms48644 KiB
#include <bits/stdc++.h>
using namespace std;
/*
#pragma GCC optimize("O3")
#include <bitset>
#pragma GCC target("avx2")*/
#define fi first
#define se second
#define int long long
typedef long long ll;
typedef long double ld;
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
int inf = 1e15;

int n, k, m;
vector<vector<pair<int,int>>> g;


pair<vector<int>, vector<int>> dijktra(int st) {
    vector<int> dist(n, inf);
    vector<int> par(n, -1);
    dist[st] = 0;
    set<pair<int, int>> q = {{0, st}};
    while(!q.empty()) {
        auto pa = *q.begin();
        q.erase(q.begin());
        int d = pa.fi, v = pa.se;
        for (auto [u, w] : g[v]) {
            if (dist[u] > dist[v] + w) {
                par[u] = v;
                q.erase({dist[u], u});
                dist[u] = dist[v] + w;
                q.insert({dist[u], u});
            }
        }
    }
    return {dist, par};
}



signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> k >> m;
    vector<int> a(k);
    g.resize(n);
    for (int i = 0; i < k; i++) {
        cin >> a[i];
        a[i]--;
    }
    for (int i = 0; i < m; i++) {
        int v, u, w;
        cin >> v >> u >> w;
        g[v - 1].push_back({u - 1, w});
        g[u - 1].push_back({v - 1, w});
    }
    vector<vector<int>> di, pars;
    for (auto el: a) {
        auto spa = dijktra(el);
        di.push_back(spa.fi);
        pars.push_back(spa.se);
    }
    int mini = inf;
    vector<vector<int>> dp((1 << k), vector<int>(n, inf));
    for (int i = 0; i < k; i++) {
        int ma = (1 << i);
        for (int j = 0; j < n; j++) {
            dp[ma][j] = di[i][j];
        }
    }
    for (int ma = 0; ma < (1 << k); ma++) {
        for (int cen = 0; cen < n; cen++) {
            for (int subm = 0; subm < (1 << k); subm++) {
                bool ch = 1;
                int m2 = 0;
                for (int i = 0; i < k; i++) {
                    if (((subm >> i) & 1) && !((ma >> i) & 1))
                        ch = 0;
                    else if (!((subm >> i) & 1) && ((ma >> i) & 1)) {
                        m2 = (m2 | (1 << i));
                    }
                }
                if (!ch || (subm == 0 || m2 == 0))
                    continue;
                dp[ma][cen] = min(dp[subm][cen] + dp[m2][cen], dp[ma][cen]);
            }
        }
    }
    for (int i = 0; i < n; i++) {
        mini = min(mini, dp[dp.size() - 1][i]);
    }
    cout << mini << '\n';
}
#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...