Cod sursa(job #1581229)

Utilizator alex_bucevschiBucevschi Alexandru alex_bucevschi Data 26 ianuarie 2016 17:48:28
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <bits/stdc++.h>

#define pb push_back
#define mp make_pair
#define mt make_tuple
#define ll long long
#define pii pair<int,int>
#define tii tuple <int,int,int>
#define N 2005
#define oo 1000000005
#define X first
#define Y second
#define eps 0.0000000001
#define all(x) x.begin(),x.end()
#define tot(x) x+1,x+n+1

using namespace std;

ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");

int n, m, i, x, z, y, nn, k, j, nod, vec, cost;
priority_queue<pair<int, pii>, vector<pair<int, pii>>,  greater<pair<int, pii> >> q;
ll val, val1;
unordered_map<int, int>r;
int B, b, bb, bc, BB;
vector < tii> v[2016];
unordered_map<ll, int > d, inq;
vector<int>vb;



int main() {
    fin >> n >> m >> k;

    for(i = 1; i <= k; i++) {
        fin >> x;
        r[x] = i ;
        B |= (1 << r[x]);
        BB |= (1 << (r[x] - 1));
    }

    for(; m; m--) {
        fin >> x >> y >> z;
        b = 0;

        if(B & (1 << r[x]))
            b = (1 << (r[x] - 1));

        v[x].pb(mt(y, z, b));
        b = 0;

        if(B & (1 << r[y]))
            b = (1 << (r[y] - 1));

        v[y].pb(mt(x, z, b));
    }

    nn = (1 << k);

    for(i = 0; i < nn; i++) {
        vb.pb(i);
    }

    for(i = 1; i <= n; i++)
        for(j = 0; j < nn; j++) {
            val = i * 100000ll + vb[j];
            d[val] = oo;
        }

    b = 0;
    d[100000] = 0;
    q.push(mp(0, mp(1, b)));

    while(q.size()) {
        nod = q.top().Y.X;
        b = q.top().Y.Y;
        q.pop();
        // inq[mp(nod, b)] = 0;

        for(auto it : v[nod]) {
            tie(vec, cost, bb) = it;
            bc = 0;
            bc = (bb | b);
            val = nod * 100000ll + b;
            val1 = vec * 100000ll + bc;

            if(d[val] + cost < d[val1]) {
                d[val1] = d[val] + cost ;
                // if(!inq[mp(vec, bc)]) {
                //inq[mp(vec, bc)] = 1;
                q.push(mp(d[val1], mp(vec, bc)));
                // }
            }
        }
    }

    val = n * 100000ll + BB;
    fout << d[val];
    return 0;
}