Cod sursa(job #2112202)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 23 ianuarie 2018 10:50:52
Problema Ubuntzei Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <fstream>
#include <queue>
#include <vector>

using namespace std;

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

const int kmax = 15, f_mare = 1e9, nmax = 2005;
struct edge {
    int y, c;
};
vector<edge> ls[nmax];
int n, m, k, i, j, x, y, c;
int cost[kmax+5][nmax];
int co[nmax];
int *interzis = new int;
int sol[(1<<kmax)+5][kmax], v[kmax+5];
bool fol[nmax];

void bfs(int x, int *c) {
    queue <int> coada;
    int i;
    for (i = 1; i <= n; i++)
        co[i] = f_mare;
    co[x] = 0;
    coada.push(x);

    while (coada.empty() == 0) {
        x = coada.front();
        coada.pop();
        fol[x] = 0;
        for (auto it : ls[x]) {
            int y = it.y;
            if (co[x] + it.c < co[y]) {
                co[y] = co[x]+it.c;
                if (fol[y]) continue;
                fol[y] = 1;
                coada.push(y);
            }
        }
    }
    if (c == interzis)
        return;
    for (i = 1; i <= n; i++)
        c[i] = co[i];
}

int hamilton() {
    int i, j, w;
    for (i = 1; i < (1 << k); i++)
        for (j = 0; j < k; j++)
            sol[i][j] = f_mare;

    bfs(1, interzis);
    for (i = 0; i < k; i++)
        sol[(1<<i)][i] = co[v[i]];

    for (i = 1; i < (1 << k); i++)
        for (j = 0; j < k; j++)
            if ( (i & (1<<j)) !=0) {
                for (w = 0; w < k; w++)
                    if ( (i & (1<<w)) != 0 && w != j)
                        if (sol[i][j] > sol[i^(1<<j)][w] + cost[w][v[j]])
                            sol[i][j] = sol[i^(1<<j)][w] + cost[w][v[j]];
            }
    int minim = f_mare;
    for (i = 0; i < k; i++) {
        if (sol[(1<<k)-1][i] + cost[i][n] < minim)
            minim = sol[(1<<k)-1][i] + cost[i][n];
    }
    return minim;
}

int main() {
    f >> n >> m >> k;
    for (i = 0; i < k; i++) {
        f >> v[i];
    }
    while (m--) {
        f >> x >> y >> c;
        ls[x].push_back({y,c});
        ls[y].push_back({x,c});
    }

    for (i = 0; i < k; i++)
        bfs(v[i], cost[i]);

    g << hamilton();
}