Submission #1306158

#TimeUsernameProblemLanguageResultExecution timeMemory
1306158satoulogaritCities (BOI16_cities)C++20
100 / 100
1736 ms41456 KiB
//LongvnXD
#include <bits/stdc++.h>

#define ll long long
#define pll pair<ll, ll>
#define ii pair<int, int>
#define iii pair<ii, int>
#define dl pair<ll, ii>
#define fi first
#define se second
#define all(v) v.begin(), v.end()

const int N = 2e5 + 5;
const ll oo = 1e18 + 18;

using namespace std; 

int n, k, m, a[N], x[10];
vector<ii> g[N];

int main() {
    cin.tie(0)->sync_with_stdio(0);
    // freopen("CAU4.inp", "r", stdin);
    // freopen("CAU4.out", "w", stdout);
    
    cin >> n >> k >> m;
    vector<ll> dist(n+1, oo);
    vector<vector<ll>> d(1 << k, vector<ll>(n+1, oo));
    
    for(int i=0; i<k; ++i) {
        cin >> x[i];
        a[x[i]] = (1 << i);
        d[a[x[i]]][x[i]] = 0;
    }
    for(int i=1, u, v, w; i<=m; ++i) {
        cin >> u >> v >> w;
        g[u].push_back({v, w});
        g[v].push_back({u, w});
    }
    
    int full = (1 << k) - 1;
    for(int mask=1; mask <= full; ++mask) {
        for(int mask1 = (mask - 1) & mask; mask1; mask1 = (mask1 - 1) & mask) {
            int mask2 = mask ^ mask1;
            for(int u=1; u<=n; ++u) {
                if(d[mask2][u] == oo || d[mask1][u] == oo) continue;
                
                d[mask][u] = min(d[mask][u], d[mask1][u] + d[mask2][u]);
            }
        }
        
        priority_queue<pll, vector<pll>, greater<pll>> q;
        for(int i=1; i<=n; ++i) dist[i] = oo;
        for(int i=1; i<=n; ++i)
            if(d[mask][i] != oo)
                dist[i] = d[mask][i], q.push({dist[i], i});

        while(q.size()) {
            pll temp = q.top(); q.pop();
            ll x = temp.fi;
            int u = temp.se;

            if(x != dist[u]) continue;

            for(ii& temp2 : g[u]) {
                int v = temp2.fi;
                int w = temp2.se;
                if(dist[v] > x + w) {
                    dist[v] = x + w;
                    q.push({x + w, v});
                }
            }
        }

        for(int i=1; i<=n; ++i)
            d[mask][i] = dist[i];
    }
    
    ll ok = oo;
    for(int i=1; i<=n; ++i)
        ok = min(ok, d[full][i]);
    cout << ok;
    
    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...