Cod sursa(job #1580340)

Utilizator alex_bucevschiBucevschi Alexandru alex_bucevschi Data 25 ianuarie 2016 19:50:26
Problema Ubuntzei Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 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,bitset<16>>
#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");
struct cmp {
    bool operator()(pair<int, bitset<16>> a, pair<int, bitset<16>> b) const {
        if(a.X == b.X)
            return a.Y.to_ulong() < b.Y.to_ulong();

        return a.X < b.X;
    }
};
struct cmp1 {
    bool operator()(pair < int, pair<int, bitset<16>>> a, pair < int, pair<int, bitset<16>>> b) const {
        return a.X > b.X;
    }
};
int n, m, i, x, z, y, nn, k, j, nod, vec, cost;
priority_queue<pair<int, pair<int, bitset<16>>>, vector<pair<int, pair<int, bitset<16>>>>,  cmp1>q;

unordered_map<int, int>r;
bitset<16>B, b, bb, bc;
vector < tuple<int, int, bitset<16>>> v[2016];
map<pair<int, bitset<16>>, int , cmp> d, inq;
vector<bitset<16>>vb;
int main() {
    fin >> n >> m >> k;

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

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

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

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

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

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

    nn = (1 << k);

    for(i = 0; i < nn; i++) {
        b = 0;
        x = i;
        j = 1;

        while(x) {
            b[j++] = x % 2;
            x /= 2;
        }

        vb.pb(b);
    }

    for(i = 1; i <= n; i++)
        for(j = 0; j < nn; j++)
            d[mp(i, vb[j])] = oo;

    b = 0;
    d[mp(1, b)] = 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);

            if(d[mp(nod, b)] + cost < d[mp(vec, bc)]) {
                d[mp(vec, bc)] = d[mp(nod, b)] + cost;

                if(!inq[mp(vec, bc)]) {
                    inq[mp(vec, bc)] = 1;
                    q.push(mp(d[mp(vec, bc)], mp(vec, bc)));
                }
            }
        }
    }

    fout << d[mp(n, B)];
    return 0;
}