Cod sursa(job #634627)

Utilizator MKLOLDragos Ristache MKLOL Data 16 noiembrie 2011 20:10:38
Problema Bibel Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include<stdio.h>
#include<algorithm>
#include<vector>
#define pb push_back
#define mp make_pair
#define fs first
#define sc second
using namespace std;
vector< pair<int,int> > v,ww;
int din[18][1<<17+5];
int cost[25][25],N,M;
int nr=0;
int calc(pair<int,int> a,pair<int,int> b)
{
    return (a.fs-b.fs)*(a.fs-b.fs) + (a.sc-b.sc)*(a.sc-b.sc);
};
int nrbit(int bits)
{int num=0;
    while(bits)
    {
        if(bits%2==1)
            ++num;
        bits=bits/2;
    }
    return num;
};
int main()
{
freopen("bibel.in","r",stdin);
freopen("bibel.out","w",stdout);
int x,q,w;
    while(1)
    {   ++nr;
        if(nr!=1)
        {
        for(int i=0;i<N;++i)
            ww.pb(v[i]);
            M=N;
        v.clear();
        }
        do
        {
        scanf("%d",&x);
            if(x==2)
                return 0;
            if(x==0)
            {
            scanf("%d%d",&q,&w);
            v.push_back( mp(q,w) );
            }
        }
        while(x==0);
        if(x==2)
            return 0;

        N=v.size();

        for(int i=0;i<N;++i)
            for(int j=0;j<N;++j)
            {
                if(i==j)
                    cost[i][j]=12345678;
                cost[i][j]=calc(v[i],v[j]);
            }

            if(nr==1)
            {
            for(int i=0;i<N;++i)
                for(int j=0;j<(1<<N);++j)
                    din[i][j]=1234567;

            for(int i=0;i<N;++i)
                din[i][1<<i]=calc(mp(0,0),v[i]);
            }
            else
        {
        for(int i=0;i<N;++i)
        {
            din[i][1<<i]=12345678;
            for(int j=0;j<M;++j)
            din[i][1<<i]=min(din[i][1<<i],din[j][(1<<M)-1]+calc(v[i],ww[j]));
        }
        }
        if(nr!=1)
        for(int i=0;i<N;++i)
                for(int j=0;j<(1<<N);++j)
                    if(nrbit(j)!=1)
                    din[i][j]=12345689;
       // for(int i=0;i<N;++i)
          //  printf("%d! ",din[i][1<<i]);
        for(int j=1;j<(1<<N);++j)
            for(int i=0;i<N;++i)
            {
                if(nrbit(j)!=1)
                {
                if((1<<i)&j)
                {
                for(int k=0;k<N;++k)
                    din[i][j]=min(din[i][j],din[k][j^(1<<i)]+cost[i][k]);
                }

                }
            }
            int rez=12345678;
            for(int i=0;i<N;++i)
                rez=min(rez,din[i][(1<<N)-1]);
                printf("%d\n",rez);
    }
return 0;
}