Cod sursa(job #2576361)

Utilizator lupulescu2001Lupulescu Vlad lupulescu2001 Data 6 martie 2020 18:45:02
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <fstream>
#include <functional>
#include <vector>
#include <queue>

using namespace std;

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

const int nMax = 2005, oo = 20000000, cmax = 1 << 18;
vector <pair<int, int>> g[nMax], newg[20];
int v[20], n, m, k, dp[nMax], a[20][20], cfg[cmax][20];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;

void Dijkstra(int smth, int ind) {
    for (int i = 1; i <= n; i++)
        dp[i] = oo;
    pq.push({0, smth});
    dp[smth] = 0;
    while (!pq.empty()) {
        int nod = pq.top().second, cost = pq.top().first;
        pq.pop();
        if (dp[nod] != cost)
            continue;
        for (auto i : g[nod])
            if (dp[nod] + i.second < dp[i.first]) {
                dp[i.first] = dp[nod] + i.second;
                pq.push({dp[i.first], i.first});
            }
    }
    for (int i = 0; i <= k; i++)
        a[ind][i] = dp[v[i]];
}

void Solve() {
    int f = 1 << (k + 1);
    f--;
    for (int i = 0; i <= f; i++)
        for (int j = 0; j <= k; j++)
            cfg[i][j] = oo;
    cfg[1][0] = 0;
    for (int i = 1; i <= f; i++) {
        if (i & 1 == 0)
            continue;
        for (int j = 0; j <= k; j++) {
            if ((i & (1 << j)) == 0)
                continue;
            for (int p = 0; p <= k; p++)
                if ((i & (1 << p)) && a[j][p])
                    cfg[i][j] = min(cfg[i][j], cfg[i - (1 << j)][p] + a[j][p]);
        }
    }

    fout << cfg[f][k] << '\n';
}

int main() {
    fin >> n >> m;
    fin >> k;
    for (int i = 1; i <= k; i++)
        fin >> v[i];
    v[0] = 1;
    v[k + 1] = n;
    k++;
    for (int i = 1; i <= m; i++) {
        int x, y, z;
        fin >> x >> y >> z;
        g[x].push_back({y, z});
        g[y].push_back({x, z});
    }
    for (int i = 1; i <= k; i++)
        Dijkstra(v[i], i);
    Solve();
}