Submission #1245878

#TimeUsernameProblemLanguageResultExecution timeMemory
1245878boxfishCities (BOI16_cities)C++20
74 / 100
6095 ms262616 KiB
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll inf = 2e18;
const int N = 2e5;

int n, k, m;
ll Dis[N][(1 << 6)];
struct Node{
    int u;
    ll w;
    int mask;
    bool operator < (const Node&other) const{
        return w > other.w;
    }
};
vector<pair<int,ll>> g[N + 5];

int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    priority_queue<Node> pq;
    cin >> n >> k >> m;
    for(int i = 1 ; i <= n ; ++i)
        for(int _ = 0 ; _ < (1 << k) ; ++_){
            Dis[i][_] = inf;
        }

    for(int i = 0 ; i < k ; ++i){
        int x; cin >> x;
        Dis[x][(1 << i)] = 0;
        pq.push({x,0,(1 << i)});
    }
    for(int i = 1 ; i <= m ; ++i){
        int x,y;
        ll z;
        cin >> x >> y >> z;
        g[x].push_back({y,z});
        g[y].push_back({x,z});
    }

    while(!pq.empty()){
        Node t = pq.top();
        pq.pop();
        int u = t.u;
        ll w = t.w;
        int mask = t.mask;
        if(w != Dis[u][mask]) continue;
//        cout << u << ' ' << w << ' ' << mask << "\n";

        for(pair<int,ll> i : g[u]){
            ll X = w + i.second;
            if(Dis[i.first][mask] > X){
                Dis[i.first][mask] = X;
                pq.push({i.first,X,mask});
            }
        }

        for(int _ = 1 ; _ < (1 << k) ; ++_){
            ll X = w + Dis[u][_];

            if(X < Dis[u][mask | _]){
                Dis[u][mask | _] = X;
                pq.push({u,X,(mask | _)});
            }
        }
    }
    ll ans = inf;
    for(int i = 1 ; i <= n ; ++i)
        ans = min(ans,Dis[i][(1 << k) - 1]);
    cout << ans;
    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...