Cod sursa(job #1723666)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 1 iulie 2016 12:27:19
Problema Bibel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>

using namespace std;

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

const int f_mare = 2000000000;
int xx, x[25], y[25], n, np;
int xp[25], yp[25], lvl;
int mat[180000][25];

inline int dist(int x1, int y1,
                int x2, int y2){
    return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
}

inline int rezolva(){
    int i, j, k;
    if (lvl == 1)
        np = n;

    for (i = 1; i < (1 << n); i++)
        for (j = 0; j < n; j++)
            mat[i][j] = f_mare;

    for (j = 0; j < np; j++)
        for (i = 0; i < n; i++)
            mat[(1 << i)][i] = min(mat[(1<<i)][i], mat[0][j]+dist(x[i], y[i], xp[j], yp[j]));

    for (i = 1; i < (1 << n); i++)
        for (j = 0; j < n; j++)
            if (i & (1 << j))
                for (k = 0; k < n; k++)
                    if (i & (1 << k) && k != j)
                        mat[i][j] = min(mat[i][j], mat[i^(1<<j)][k] + dist(x[k], y[k], x[j], y[j]));

    int minim = f_mare;
    for (i = 0; i < n; i++){
        minim = min(minim, mat[(1 << n)-1][i]);
        xp[i] = x[i];
        yp[i] = y[i];
        mat[0][i] = mat[(1<<n)-1][i];
    }
    np = n;
    return minim;
}

int main(){
    lvl = 1;
    while (1){
        f >> xx;
        if (xx == 0){
            f >> x[n] >> y[n];
            n++;
        }
        else if (xx == 1){
            g << rezolva() << '\n';
            lvl++;
            n = 0;
        }
        else if (xx == 2)
            break;
    }
    return 0;
}