Cod sursa(job #1734438)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 27 iulie 2016 12:07:38
Problema Ubuntzei Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>

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[20000][20];
unsigned dist[2005][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];
            }
        }
    }
    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];


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