Cod sursa(job #1893008)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 25 februarie 2017 14:00:22
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <fstream>
#include <queue>
#include <vector>
#include <iostream>

using namespace std;

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

const int f_mare = 1000000005;
vector <int> ls[2005], lc[2005];
int dist[20][2005], n,m,x,y,c,i, j, w,K,cb[20];
int sol[33000][2005];

void bf(int k) {
    int i, l, y;
    x = cb[k];
    queue <int> q;
    q.push(x);
    for (i = 1; i <= n; i++)
        dist[k][i] = f_mare;
    dist[k][x] = 0;
    while (q.empty() == 0) {
        x = q.front();
        l = ls[x].size();
        q.pop();
        for (i = 0; i < l; i++) {
            y = ls[x][i];
            if (dist[k][x] + lc[x][i] < dist[k][y]) {
                dist[k][y] = dist[k][x]+lc[x][i];
                q.push(y);
            }
        }
    }
}

int main() {
    f >> n >> m >> K;
    for (i = 0; i < K; i++)
        f >> cb[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);
    }
    if (K == 0) {
        cb[1] = 1;
        bf(1);
        g << dist[1][n];
    }
    else {
        for (i = 0; i < K; i++)
            bf(i);
        for (i = 0; i <= (1<<K);i++)
            for (j= 0;j<=n; j++)
                sol[i][j] = f_mare;
        for (i = 0; i < K; i++)
            sol[(1<<i)][cb[i]] = dist[i][1];

        for (i = 1; i < (1<<K); i++) {
            for (j = 0; j < K; j++)
                if ((i&(1<<j))) {
                    for (w = 0; w < K; w++)
                        if (w != j && (i&(1<<w)))
                            sol[i][j] = min(sol[i][j], sol[i^(1<<j)][w]+dist[w][cb[j]]);
                }
        }
        int minim = f_mare;
        for (i = 0; i < K; i++)
            minim = min(minim, sol[(1<<K)-1][cb[i]]+dist[i][n]);
        g<<minim;
    }
    return 0;
}