Cod sursa(job #2983009)

Utilizator DKMKDMatei Filibiu DKMKD Data 21 februarie 2023 13:59:22
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define PA pair<int, int>

using namespace std;

ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");

int n, m, x, y, c, k, v[17], d[2005], dist[2005][2005], dp[1 << 17][17];
vector<PA> G[2005];
priority_queue<PA, vector<PA>, greater<PA>> Q;

void dijkstra(int nod) {
    for (int i = 1; i <= n; i++) {
        d[i] = INF;
    }
    d[nod] = 0;
    Q.push({ 0, nod });
    while (!Q.empty()) {
        int x = Q.top().first;
        int y = Q.top().second;
        Q.pop();
        if (x > d[y]) {
            continue;
        }
        for (auto i : G[y]) {
            int vecin = i.first, cost = i.second;
            if (d[vecin] > d[y] + cost) {
                d[vecin] = d[y] + cost;
                Q.push({ d[vecin], vecin });
            }
        }
    }
}

int main() {
    fin >> n >> m;
    fin >> k;
    for (int i = 1; i <= k; i++) {
        fin >> v[i];
    }
    for (int i = 1; i <= m; i++) {
        fin >> x >> y >> c;
        G[x].push_back({ y, c });
        G[y].push_back({ x, c });
    }
    fin.close();
    v[0] = 1;
    v[k + 1] = n;
    for (int i = 0; i <= k + 1; i++) {
        dijkstra(v[i]);
        for (int j = 0; j <= k + 1; j++) {
            dist[i][j] = dist[j][i] = d[v[j]];
        }
        dist[i][i] = INF;
    }
    for (int i = 0; i < (1 << (k + 2)); i++) {
        for (int j = 0; j <= k + 1; j++) {
            dp[i][j] = INF;
        }
    }
    dp[0][0] = dist[0][0] = 0;
    for (int i = 0; i < (1 << (k + 2)); i++) {
        for (int j = 0; j <= k + 1; j++) {
            if (i & (1 << j)) {
                for (int l = 0; l <= k + 1; l++) {
                    dp[i][j] = min(dp[i][j], dp[i ^ (1 << j)][l] + dist[j][l]);
                }
            }
        }
    }
    fout << dp[(1 << (k + 2)) - 1][k + 1];;
    return 0;
}