Cod sursa(job #1734389)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 27 iulie 2016 11:27:48
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

const unsigned f_mare = 2e+9;
unsigned n, m, k, c[2005];
unsigned minim = f_mare, i, j, x, y, C, I;
vector <unsigned> ls[2005], lc[2005];
unsigned mat[18000][15];
queue <unsigned> nod;
unsigned dist[20][20];

inline void bf(int K) {
    int x, y, c, l, i;
    unsigned distantza[2005];
    for (i = 1; i <= n; i++)
        distantza[i] = f_mare;
    distantza[K] = 0;
    nod.push(K);
    while (nod.empty() == 0) {
        x = nod.front();
        nod.pop();
        l = ls[x].size();
        for (i = 0; i < l; i++) {
            y = ls[x][i];
            c = lc[x][i];
            if (distantza[x] + c < distantza[y]) {
                distantza[y] = distantza[x]+c;
                nod.push(y);
            }
        }
    }
    for (i = 1; i <= n; i++)
        dist[K][i] = dist[i][K] = distantza[i];
}

int main() {
    f >> n >> m >> k;
    for (i = 0; i < k; i++)
        f >> c[i];
    for (i = 1; i <= m; i++) {
        f >> x >> y >> C;
        ls[x].push_back(y);
        lc[x].push_back(C);
        ls[y].push_back(x);
        lc[y].push_back(C);
    }

    for (i = 1; i <= k; i++)
        bf(c[i-1]);

    for (i = 1; i < (1 << k); i++)
        for (j = 0; j < k; j++)
            mat[i][j] = f_mare;

    for (i = 0; i < k; i++)
        mat[(1 << i)][i] = dist[1][c[i]];

    if (k > 1) {
    for (i = 1; i < (1 << k); i++)
        for (j = 0; j < k; j++)
            if (i & (1 << j)) {
                for (I = 0; I < k; I++)
                    if (I != j && (i & (1 << I)))
                        mat[i][j] = min(mat[i][j], mat[i^(1 << j)][I] + dist[c[I]][c[j]]);
            }
    }
    for (i = 0; i < k; i++)
        if (mat[(1<<k)-1][i] + dist[c[i]][n] < minim)
            minim = mat[(1<<k)-1][i] + dist[c[i]][n];
    g << minim;
    return 0;
}