Cod sursa(job #1384143)

Utilizator retrogradLucian Bicsi retrograd Data 10 martie 2015 21:49:09
Problema Ubuntzei Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include<fstream>
#include<queue>
#include<unordered_map>

using namespace std;
typedef int64_t var;

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


#define INF (1<<28)
#define MAXK 16
#define MAXN 1001


struct Edge {
    var n, c;
    Edge(var n, var c) {
        this->n = n;
        this->c = c;
    }
};
typedef Edge Node;

unordered_map<var, var> D[MAXN];
unordered_map<var, bool> INQ[MAXN];
var POI[MAXN];
vector<Edge> G[MAXN];
var n, k;



void bellman() {
    queue<Node> Q;
    var conf = 0;
    if(POI[1]) conf |= (1 << (POI[1] - 1));
    for(var i=1; i<=n; i++) {
        for(var conf = 0; conf < (1<<k); conf ++)
            D[i][conf] = INF;
    }
    D[1][conf] = 0;
    Q.push(Node(1, conf));
    while(!Q.empty()) {
        var node = Q.front().n;
        var conf = Q.front().c;
        Q.pop();
        INQ[node][conf] = 0;
        for(auto e : G[node]) {
            var newconf = conf;
            if(POI[e.n]) {
                newconf |= (1 << (POI[e.n]-1));
            }
            if(D[e.n][newconf] > D[node][conf] + e.c) {
                D[e.n][newconf] = D[node][conf] + e.c;
                if(!INQ[e.n][newconf]) {
                    Q.push(Node(e.n, newconf));
                    INQ[e.n][newconf] = 1;
                }
            }
        }
    }
}



int main() {
    var m, a, b, c, t;
    fin>>n>>m>>k;
    for(var i=1; i<=k; i++) {
        fin>>t;
        POI[t] = i;
    }
    while(m--) {
        fin>>a>>b>>c;
        G[a].push_back(Edge(b, c));
        G[b].push_back(Edge(a, c));
    }
    bellman();

    fout<<D[n][(1<<k)-1];

    return 0;
}