Cod sursa(job #2576270)

Utilizator lupulescu2001Lupulescu Vlad lupulescu2001 Data 6 martie 2020 18:13:22
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 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];
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 = 1; i <= k; i++)
        a[ind][i] = dp[v[i]];
}

void Solve() {
    int f = 1 << (k - 1);
    for (int i = 0; i <= f - 1; i++)
        cfg[i] = oo;
    cfg[1] = 0;
    for (int i = 1; i <= f - 1; i++) {
        if (i & 1 == 0)
            continue;
            for (int j = 2; j < k; j++) {
                int ceva = (1 << (j - 1)) & i;
                if (ceva != 0) {
                    for (int p = 1; p < k; p++) {
                        if ((1 << (p - 1)) & i != 0)
                            cfg[i] = min(cfg[i], cfg[i - (1 << (j - 1))] + a[j][p]);
                    }
                }
            }
    }
    int ans = oo;
    for (int i = 2; i < k; i++)
        ans = min(ans, cfg[f - 1] + a[i][k]);
    fout << ans << '\n';
}

int main() {
    fin >> n >> m;
    fin >> k;
    for (int i = 2; i <= k + 1; i++)
        fin >> v[i];
    v[1] = 1;
    v[k + 2] = n;
    k += 2;
    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();
}