제출 #1245774

#제출 시각아이디문제언어결과실행 시간메모리
1245774baotoan655Cities (BOI16_cities)C++20
100 / 100
751 ms32428 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;

#define int long long
const int INF = 1e16;

void solve(int tc) {
    int n, k, m;
    cin >> n >> k >> m;
    vector<int> imp(k);
    for (auto& i : imp) {
        cin >> i, i--;
    }

    k--;
    vector<vector<pair<int, int>>> adj(n);
    for (int i = 0; i < m; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        a--, b--;
        adj[a].emplace_back(b, c);
        adj[b].emplace_back(a, c);
    }

    vector<vector<int>> dp(1 << k, vector<int>(n, INF));
    for (int i = 0; i < k; i++) {
        dp[1 << i][imp[i]] = 0;
    }
    for (int mask = 1; mask < 1 << k; mask++) {
        for (int nmask = 1; nmask < mask; nmask++) {
            if ((nmask | mask) != mask) continue;
            int tmp = nmask ^ mask;
            if (tmp < nmask) continue;
            for (int i = 0; i < n; i++) {
                dp[mask][i] = min(dp[mask][i], dp[nmask][i] + dp[tmp][i]);
            }
        }
        priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
        for (int i = 0; i < n; i++) {
            if (dp[mask][i] == INF) continue;
            pq.emplace(dp[mask][i], i);
        }
        vector<int> vis(n);
        while (!pq.empty()) {
            auto [w, u] = pq.top();
            pq.pop();
            if (vis[u]) continue;
            vis[u] = 1;
            for (auto [v, vw] : adj[u]) {
                if (dp[mask][v] <= w + vw) continue;
                dp[mask][v] = w + vw;
                pq.emplace(dp[mask][v], v);
            }
        }
    }
    cout << dp[(1 << k) - 1][imp[k]] << '\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...