Cod sursa(job #362660)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 10 noiembrie 2009 16:44:25
Problema Bibel Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include<stdio.h>

#define minim(a,b) ((a < b) ? a : b)
#define ll long long

typedef struct { int x, y; } punct;

int n, nant;
punct v[32],ant[32];
ll M[1<<17][17],sol[17],solnou[17],bst;

int bit(int x, int nr)
{
    if (x & (1<<nr))
        return 1;
    return 0;
}

ll sqr(ll x)
{ return x * x; }

ll pd(int startx, int starty)
{
    int i,j,k;
    ll bst;

    M[0][0] = 0;
    for (j=0;j<n;j++)
        M[0][j]=((ll)1<<60);
    for (i = 1; i < (1<<n); i++)
        for (j = 0; j<n; j++)
        {
            M[i][j] = ((ll)1<<60);
            if (i == (1<<j)) // i contine un singur element, pe j
            {
                M[i][j] = sqr(v[j].x-startx) + sqr(v[j].y-starty);
                continue;
            }
            
            if (bit(i, j)) // j apartine multimii i
                for (k = 0; k < n; k++)
                    if (bit(i-(1<<j), k))
                    {
                        ll dst = M[i-(1<<j)][k] + sqr(v[j].x-v[k].x) + sqr(v[j].y-v[k].y);
                        M[i][j] = minim(M[i][j], dst);
                    }
        }
        
    bst=((ll)1<<60);
    for (j=0;j<n;j++)
        bst=minim(bst,M[(1<<n)-1][j]);
    return bst;
}

int main ()
{
    int t,j,k,nivel=0;
    
    freopen("bibel.in","r",stdin);
    freopen("bibel.out","w",stdout);
    while(1)
    {
        scanf("%d",&t);
        if(t==2)
            return 0;
        if(t==0)
        {
            scanf("%d %d", &v[n].x, &v[n].y);
            n++;
            continue;
        }
        if (nivel==0)
        {
            bst = pd(0, 0);
            for(j=0;j<n;j++)
                solnou[j]=M[(1<<n)-1][j];
        }
        else
        {
            bst = ((ll)1<<60);
            for(j=0;j<n;j++)
                solnou[j]=((ll)1<<60);
            for(j=0;j<nant;j++)
            {
                ll c=sol[j]+pd(ant[j].x,ant[j].y);
                for (k=0;k<n;k++)
                    solnou[k] = minim(solnou[k], sol[j]+M[(1<<n)-1][k]);
                bst = minim(bst, c);
            }            
        }
        printf("%lld\n", bst);
        nivel++;
        nant=n;
        for(j=0;j<n;j++)
        {
            ant[j].x=v[j].x;
            ant[j].y=v[j].y;
        }
        for(j=0;j<n;j++)
            sol[j]=solnou[j];
        n=0;
    }
    return 0;
}