Cod sursa(job #1144623)

Utilizator tudgal1001Profir Tudor tudgal1001 Data 17 martie 2014 13:00:59
Problema Bibel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<cstdio>
#define inf (1LL<<31)-1
#define NMax 20
using namespace std;

int V[1<<NMax][NMax];
int N,NPrc,CPrc[NMax];
struct Punct { int x,y; };
Punct A[NMax],prc[NMax];

int mini (int x, int y)
{
    return (x<y) ? x : y;
}

int dist (Punct P1, Punct P2)
{
    return (P1.x-P2.x)*(P1.x-P2.x)+(P1.y-P2.y)*(P1.y-P2.y);
}

int solve ()
{
    int i,j,k,min=inf;
    for (i=0; i<(1<<N); i++)
        for (j=0; j<N; j++)
            V[i][j]=inf;
    for (i=0; i<N; i++)
        for (j=0; j<NPrc; j++)
            V[1<<i][i]=mini(V[1<<i][i],CPrc[j]+dist(prc[j],A[i]));
    for (i=0; i<(1<<N); i++)
        for (j=0; j<N; j++)
            if ((1<<j) & i)
                for (k=0; k<N; k++)
                    if ((1<<k) & i)
                        V[i][j]=mini(V[i][j],V[i^(1<<j)][k]+dist(A[k],A[j]));
    for (i=0; i<N; i++)
    {
        if (V[(1<<N)-1][i]<min)
            min=V[(1<<N)-1][i];
        CPrc[i]=V[(1<<N)-1][i];
        prc[i]=A[i];
    }
    NPrc=N;
    return min;
}

int main ()
{
    int tip,crt=0,stare=1;
    freopen("bibel.in","r",stdin);
    freopen("bibel.out","w",stdout);
    NPrc=1;
    while (stare)
    {
        scanf("%d",&tip);
        if (!tip)
            scanf("%d%d",&A[crt].x,&A[crt].y), crt++;
        else if (tip==1)
            N=crt, printf("%d\n",solve()), crt=0;
        else
            stare=0;
    }
    return 0;
}