Cod sursa(job #1723651)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 1 iulie 2016 12:02:15
Problema Bibel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <fstream>

using namespace std;

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

const int f_mare = 10000000;
int xx, x[25], y[25], n;
int mat[260000][25];

inline int dist(int i, int j){
    return (x[j]-x[i])*(x[j]-x[i]) + (y[j]-y[i])*(y[j]-y[i]);
}

int rezolva(){
    int i, j, k;

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

    for (i = 0; i < n; i++)
        mat[(1 << i)][i] = dist(-1, i);

    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(k, j));

    int minim = f_mare;
    for (i = 0; i < n; i++)
        minim = min(minim, mat[(1 << n)-1][i]);
    return minim;
}

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