Cod sursa(job #3276529)

Utilizator stefanrotaruRotaru Stefan-Florin stefanrotaru Data 13 februarie 2025 20:11:49
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

int n, m, ind, x, y, z, localitati[17], cost[2001], matCost[17][17], dp[1 << 17][17], ans = (1 << 30);

bool viz[2001];

vector <pair <int, int> > a[2001];

priority_queue <pair <int, int>, vector <pair <int, int> >, greater <pair <int, int> > > q;

inline void dijkstra(int nod)
{
    q.push({0, nod});

    for (int i = 1; i <= n; ++i) {
        cost[i] = (1 << 30);
        viz[i] = 0;
    }

    cost[nod] = 0;

    while (!q.empty()) {
        auto nod = q.top();

        q.pop();

        if (viz[nod.second]) {
            continue;
        }

        viz[nod.second] = 1;

        for (auto it : a[nod.second]) {
            if (nod.first + it.second < cost[it.first]) {
                cost[it.first] = nod.first + it.second;
                q.push({cost[it.first], it.first});
            }
        }
    }
}

int main()
{
    f >> n >> m >> ind;

    for (int i = 1; i <= ind; ++i) {
        f >> localitati[i];
    }

    localitati[0] = 1, localitati[++ind] = n;

    for (int i = 1; i <= m; ++i) {
        f >> x >> y >> z;

        a[x].push_back({y, z});
        a[y].push_back({x, z});
    }

    for (int i = 0; i <= ind; ++i) {
        dijkstra(localitati[i]);

        for (int j = 0; j <= ind; ++j) {
            matCost[i][j] = matCost[j][i] = cost[localitati[j]];
        }
    }

    for (int i = 0; i < (1 << (ind + 1)); ++i) {
        for (int j = 0; j <= ind; ++j) {
            dp[i][j] = (1 << 30);
        }
    }

    dp[0][0] = 0;

    for (int k = 0; k < (1 << (ind + 1)); ++k) {
        for (int i = 0; i <= ind; ++i) {
            if (k & (1 << i)) {
                for (int j = 0; j <= ind; ++j) {
                    dp[k][i] = min(dp[k][i], dp[k ^ (1 << i)][j] + matCost[i][j]);
                }
            }
        }
    }

    g << dp[1 << (ind + 1) - 1][ind];

    return 0;
}