Cod sursa(job #1630331)

Utilizator RazvanR104Razvan-Andrei Ciocoiu RazvanR104 Data 5 martie 2016 01:21:51
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 2010;

int N, M, K;
int who[NMAX];
vector<int> G[NMAX], C[NMAX];
unordered_map<int, int> DP[NMAX];

int main() {
    assert(freopen("ubuntzei.in", "r", stdin));
    assert(freopen("ubuntzei.out", "w", stdout));

    int i, j;

    cin >> N >> M >> K;

    memset(who, 0xff, sizeof who);
    for (i = 0; i < K; ++i) {
        int val;
        cin >> val;
        who[val] = i;
    }

    for (i = 1; i <= M; ++i) {
        int x, y, c;
        cin >> x >> y >> c;
        G[x].push_back(y);
        G[y].push_back(x);
        C[x].push_back(c);
        C[y].push_back(c);
    }

    DP[1][0] = 0;
    priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, greater<tuple<int, int, int>>> Q;
    Q.push(make_tuple(0, 1, 0));

    while (!Q.empty()) {
        int curr, node, mask;
        tie(curr, node, mask) = Q.top();
        Q.pop();

        if (node == N && mask == (1 << K) - 1) {
            cout << curr << '\n';
            return 0;
        }

        for (i = 0; i < int(G[node].size()); ++i) {
            int nnode = G[node][i];
            int ncost = C[node][i];
            int nmask = mask;

            if (who[nnode] != -1)
                nmask |= (1 << who[nnode]);

            if (DP[nnode].count(nmask) == 0 || DP[nnode][nmask] > curr + ncost) {
                DP[nnode][nmask] = curr + ncost;
                Q.push(make_tuple(curr + ncost, nnode, nmask));
            }
        }
    }

    return 0;
}