Cod sursa(job #1734441)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 27 iulie 2016 12:17:58
Problema Ubuntzei Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <fstream>

using namespace std;

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

const int f_mare = 2e+9;
int n, m, k, c[2005];
int minim = f_mare, i, j, x[10005], y[10005], C[10005], I;
int mat[35000][30];
int distantza[2005];
int V[20];

void dijkstra(int K, int dist[][2005]) {
    int i;
    bool ok;
    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];
            }
        }
    }
    if (k > 0)
        for (i = 1; i <= n; i++)
            dist[V[K]][i] = distantza[i];
    else
        for (i = 1; i <= n; i++)
            dist[1][i] = distantza[i];
}

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


    if (k > 0) {
    int dist[30][2005];
    for (i = 0; i < k; i++)
        dijkstra(c[i], dist);

    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[i][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[I][c[j]]);
            }

    for (i = 0; i < k; i++)
        if (mat[(1<<k)-1][i] + dist[i][n] < minim)
            minim = mat[(1<<k)-1][i] + dist[i][n];
    g << minim;
    }
    else {
        int dist[2][2005];
        dijkstra(n, dist);
        g << dist[1][1];
    }
    return 0;
}