Cod sursa(job #1580295)

Utilizator alex_bucevschiBucevschi Alexandru alex_bucevschi Data 25 ianuarie 2016 19:11:45
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 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");

struct cmp1 {
    bool operator()(pair < int, pair<int, int >> a, pair < int, pair<int, int >> 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, int >>, vector<pair<int, pair<int, int >>>,  cmp1>q;

unordered_map<int, int>r;
int  b, bb, bc;
bitset<16>B;
vector < tuple<int, int, int >> v[2016];
map<pair<int, int >, int > d;
vector<int >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 = (1 << r[x]);

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

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

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

    nn = (1 << (k + 1));

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

    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();

        for(auto it : v[nod]) {
            tie(vec, cost, bb) = it;
            bc = (bb | b);

            if(d[mp(nod, b)] + cost < d[mp(vec, bc)]) {
                d[mp(vec, bc)] = d[mp(nod, b)] + cost;
                q.push(mp(d[mp(vec, bc)], mp(vec, bc)));
            }
        }
    }
    nn=B.to_ulong();
    fout << d[mp(n, nn)];
    return 0;
}