Cod sursa(job #3275921)

Utilizator Barbu_MateiBarbu Matei Barbu_Matei Data 11 februarie 2025 22:53:34
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <bits/stdc++.h>
using namespace std;

int n, m, k;
vector<pair<int, int>> v[2001];
int c[17], dp[2001][(1 << 17)];
int g[2001][2001];
bool city[2001];

void dijkstra(int start) {
    int cost[2001];
    memset(cost, 0x3f, sizeof(cost));
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
    q.push({0, start});
    cost[start] = 0;
    while (!q.empty()) {
        int node = q.top().second;
        if (node != start && (city[node] || node == 1 || node == n)) {
            g[start][node] = cost[node];
        }
        q.pop();
        for (int i = 0; i < v[node].size(); ++i) {
            if (cost[node] + v[node][i].second < cost[v[node][i].first]) {
                cost[v[node][i].first] = cost[node] + v[node][i].second;
                q.push({cost[v[node][i].first], v[node][i].first});
            }
        }
    }
}

int main() {
    ifstream cin("ubuntzei.in");
    ofstream cout("ubuntzei.out");
    cin >> n >> m >> k;
    for (int i = 1; i <= k; ++i) {
        cin >> c[i];
        city[c[i]] = 1;
    }
    c[++k] = n;
    c[++k] = 1;
    for (int i = 1; i <= m; ++i) {
        int x, y, z;
        cin >> x >> y >> z;
        v[x].push_back({y, z});
        v[y].push_back({x, z});
    }
    for (int i = 1; i <= k; ++i) {
        dijkstra(c[i]);
    }
    memset(dp, 0x3f, sizeof(dp));
    dp[1][1 << (k - 1)] = 0;
    for (int s = (1 << (k - 1)) + 1; s <= (1 << k) - 1; ++s) {
        for (int i = 1; i <= k; ++i) {
            if (s & (1 << (i - 1))) {
                for (int l = 1; l <= k; ++l) {
                    if (l != i && s & (1 << (l - 1))) {
                        if (g[c[l]][c[i]]) {
                            dp[c[i]][s] = min(dp[c[i]][s], dp[c[l]][s ^ (1 << (i - 1))] + g[c[l]][c[i]]);
                        }
                    }
                }
            }
        }
    }
    cout << dp[n][(1 << k) - 1];
}