Cod sursa(job #2861512)

Utilizator EusebiudistrugatorulLionel Messi Eusebiudistrugatorul Data 4 martie 2022 08:57:30
Problema Ubuntzei Scor 75
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <bits/stdc++.h>
#define ii pair<int, int>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
bitset<2003> imp_city;
vector<vector<ii>> edges(2003);
vector<vector<int>> dist(2003, vector<int>(2003, 2e9));

void find_dist(int node, int k) {
    set<ii> nodes;
    nodes.insert({0, node});
    dist[node][node] = 0;
    while (!nodes.empty()) {
        int cur_dist = nodes.begin()->first, cur_node = nodes.begin()->second;
        nodes.erase(nodes.begin());
        for (auto itr : edges[cur_node]) {
            int dest = itr.first, cost = itr.second;
            if (imp_city[dest] and dest < node and dist[dest][node] == cost + cur_dist) {
                nodes.insert({dist[dest][node], dest});
            } else if (dist[node][dest] > cost + cur_dist) {
                if (dist[node][dest] != 2e9) {
                    nodes.erase({dist[dest][node], dest});
                }
                dist[node][dest] = dist[dest][node] = cost + cur_dist;
                nodes.insert({cost + cur_dist, dest});
            }
        }
    }
}

int32_t main() {
    int n, m, k;
    fin >> n >> m >> k;
    for (int i = 1; i <= k; ++i) {
        int num; fin >> num;
        imp_city[num] = true;
    }
    imp_city[1] = imp_city[n] = true;
    for (int i = 1; i <= m; ++i) {
        int a, b, t;
        fin >> a >> b >> t;
        edges[a].push_back({b, t});
        edges[b].push_back({a, t});
    }
    vector<int> act_cities;
    for (int i = 1; i <= n; ++i) {
        if (imp_city[i]) {
            find_dist(i, k);
            act_cities.push_back(i);
        }
    }
    vector<vector<int>> min_cost(1 << (k + 2), vector<int>(k + 2, 2e9));
    min_cost[1][0] = 0;
    for (int mask = 1; mask < (1 << (k + 2)); ++mask) {
        for (int i = 0; i < k + 2; ++i) {
            for (int bit = 0; bit < k + 2; ++bit) {
                if (mask & (1 << bit)) {
                    continue;
                }
                int nmask = mask | (1 << bit);
                min_cost[nmask][bit] = min(min_cost[mask][i] + dist[act_cities[i]][act_cities[bit]], min_cost[nmask][bit]);
            }
        }
    }
    fout << min_cost[(1 << (k + 2)) - 1][k + 1];
    return 0;
}