Cod sursa(job #1753206)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 6 septembrie 2016 09:04:23
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <fstream>
#include <queue>

using namespace std;

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

const unsigned f_mare = 3.5e+9;
unsigned n, m, k, c[2005];
unsigned minim = f_mare, i, j, x[10005], y[10005], C[10005], I;
unsigned mat[36000][20];
unsigned dist[2005][2005];
vector <int> ls[2005], lc[2005];

void dijkstra(int K) {
    int i;
    bool ok;
    unsigned distantza[2005];
    for (i = 1; i <= n; i++)
        distantza[i] = f_mare;
    distantza[K] = 0;
    ok = 1;
    while (ok) {
        ok = 0;
        for (i = 1; i <= m; i++) {
            if (distantza[x[i]] < f_mare){
                if (distantza[x[i]] + C[i] < distantza[y[i]] && y[i] != K)
                    ok = 1, distantza[y[i]] = distantza[x[i]] + C[i];
            }
            if (distantza[y[i]] < f_mare) {
                if (distantza[y[i]] + C[i] < distantza[x[i]] && x[i] != K)
                    ok = 1, distantza[x[i]] = distantza[y[i]] + C[i];
            }
        }
    }
    /*int x, y, c;
    queue <int> coada;
    coada.push(K);
    while (coada.empty() == 0) {
        x = coada.front();
        coada.pop();
        for (i = 0; i < ls[x].size(); i++) {
            y = ls[x][i];
            c = lc[x][i];
            if (distantza[x] + c < distantza[y]) {
                distantza[y] = distantza[x]+c;
                coada.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[i] >> y[i] >> C[i];
        ls[x[i]].push_back(y[i]);
        lc[x[i]].push_back(c[i]);
        ls[y[i]].push_back(x[i]);
        lc[y[i]].push_back(c[i]);
    }


    if (k > 0) {

    for (i = 0; i < k; i++)
        dijkstra(c[i]);

    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]];


    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;
    }
    else {
        dijkstra(n);
        g << dist[1][n];
    }
    return 0;
}