Cod sursa(job #634672)

Utilizator MKLOLDragos Ristache MKLOL Data 16 noiembrie 2011 21:24:38
Problema Bibel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.77 kb
#include<fstream>
#include<algorithm>
#include<vector>
#define pb push_back
#define mp make_pair
#define fs first
#define sc second
#define inf 0x3f3f3f3f

using namespace std;

ifstream fin("bibel.in");
ofstream fout("bibel.out");

vector< pair<int,int> > v,ww;
int din[(1<<17)+5][17],fincost[20];
short nrb[1<<17][17];
int cost[25][25],N,M;
int rez;
int nr=0;
inline 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 main()
{

int x,q,w;
    while(1)
    {   ++nr;

        if(nr!=1)
        {
        ww.clear();
        for(int i=0;i<N;++i)
            fincost[i]=din[(1<<N)-1][i];
        for(int i=0;i<N;++i)
            ww.pb(v[i]);
            M=N;
        v.clear();
        }
        do
        {
        fin>>x;
            if(x==2)
                return 0;
            if(x==0)
            {
            fin>>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]=inf;
                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[j][i]=inf;
            if(nr==1)
            {
            for(int i=0;i<N;++i)
                din[1<<i][i]=calc(mp(0,0),v[i]);
            }
            else
        {
        for(int i=0;i<N;++i)
        {
        din[1<<i][i]=inf;
            for(int j=0;j<M;++j)
            din[1<<i][i]=min(din[1<<i][i],fincost[j]+calc(v[i],ww[j]));
        }
        }
       /* printf("Costuri initiale:\n");
        for(int i=0;i<N;++i)
            printf("%d ",din[i][1<<i]);
            printf("\n");*/
        for(int j=1;j<(1<<N);++j)
            for(int i=0;i<N;++i)
            {
                if((j&(j-1)))
                {
                if((1<<i)&j)
                {
                for(int k=0;k<N;++k)
                    if((1<<k)&j)
                    if(k!=i)
                    if(din[j][i]>(din[j^(1<<i)][k]+cost[k][i]))
                    {
                    din[j][i]=din[j^(1<<i)][k]+cost[k][i];
                    nrb[j][i]=nr;
                    }
                    else if(nrb[j][i]!=nr)
                    {
                         nrb[j][i]=nr;
                         din[j][i]=din[j^(1<<i)][k]+cost[k][i];
                    }
                }

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