제출 #1316345

#제출 시각아이디문제언어결과실행 시간메모리
1316345nguyenkhangninh99Cities (BOI16_cities)C++20
100 / 100
1535 ms45560 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int n, m, k; cin >> n >> k >> m;
    vector<int> imp(k); 
    for(int i = 0; i < k; i++) cin >> imp[i];

    vector<vector<pair<int, int>>> adj(n + 1, vector< pair<int, int>>());
    for(int i = 1; i <= m; i++){
        int u, v, c; cin >> u >> v >> c;
        adj[u].push_back({v, c});
        adj[v].push_back({u, c});
    }

    vector<vector<int>> dp(1 << k, vector<int>(n + 1, 1e18));
    for(int i = 0; i < k; i++) dp[1 << i][imp[i]] = 0;

    for(int mask = 0; mask < (1 << k); mask++){
        for(int sub = mask; sub; sub = ((sub - 1) & mask)){
            for(int i = 1; i <= n; i++) dp[mask][i] = min(dp[mask][i], dp[sub][i] + dp[mask ^ sub][i]);
        }

        priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
        vector<int> vis(n + 1);
        for(int i = 1; i <= n; i++) pq.push({dp[mask][i], i});
        while(!pq.empty()){
            auto [dist, u] = pq.top(); 
            pq.pop();
            if(vis[u]) continue;
            vis[u] = true;

            for(auto [v, w]: adj[u]){
                if(dp[mask][v] > dp[mask][u] + w){
                    dp[mask][v] = dp[mask][u] + w;
                    pq.push({dp[mask][u] + w, v});
                }
            }
        }
    }

    cout << *min_element(dp.back().begin(), dp.back().end());
}
#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...