Cod sursa(job #2840854)

Utilizator Cosmin2004_InfoMoldoveanu Cosmin Cosmin2004_Info Data 28 ianuarie 2022 20:46:42
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>

using namespace std;
const int N = 2000, K = 15;
int d[N + 5][N + 5];
vector <pair <int, int>> g[N + 5];

void dijkstra(int s, int n) {
    priority_queue <pair <int, int>> pq;
    fill(d[s] + 1, d[s] + n + 1, 2e9);
    for(pq.emplace(0, s), d[s][s] = 0; !pq.empty(); pq.pop()) {
        auto [dist, u] = pq.top();
        if(-dist != d[s][u]) continue;
        for(auto [v, w] : g[u]) if(d[s][v] > w - dist) {
            d[s][v] = w - dist;
            pq.emplace(dist - w, v);
        }
    }
}

long long dp[1 << K][K];

int main()
{
    ifstream cin("ubuntzei.in");
    ofstream cout("ubuntzei.out");
    int n, m, k;
    cin >> n >> m >> k;
    vector <int> stops(k);
    for(int i = 0; i < k; i++)
        cin >> stops[i];
    for(int i = 0; i < m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        g[u].emplace_back(v, w);
        g[v].emplace_back(u, w);
    }
    dijkstra(1, n);
    for(int stop : stops)
        dijkstra(stop, n);
    for(int i = 0; i < k; i++)
        dp[1 << i][i] = d[1][stops[i]];
    int kk = 1 << k;
    for(int mask = 1; mask < kk; mask++) {
        for(int cm = mask; cm; cm &= cm - 1) {
            int u = 31 - __builtin_clz(cm & (-cm));
            for(int v = 0; v < k; v++) if(!(mask & (1 << v))) {
                int mv = mask ^ (1 << v);
                dp[mv][v] = dp[mask][u] + d[stops[u]][stops[v]];
            }
        }
    }
    long long res = 1e18;
    for(int i = 0; i < k; i++)
        res = min(res, dp[kk - 1][i] + d[stops[i]][n]);
    if(k == 0) res = d[1][n];
    cout << res;
    return 0;
}