Cod sursa(job #2378833)

Utilizator vladsirbu23Vlad Sirbu vladsirbu23 Data 12 martie 2019 17:46:46
Problema Bibel Scor 85
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <iostream>
#include <fstream>
#include <vector>
#define f first
#define s second
using namespace std;
ifstream fin("bibel.in");
ofstream fout("bibel.out");
vector <pair<int,int> > pct[210];
pair <int,int> p[210];
int L,l,dist[210][210],nrrez,baza;
long long d[131100][20],rez[20];
int main()
{
    int a,b,c,niv,i,j,k,aux;
    long long pinf,minn;
    pinf=(long long)(1<<30)*(1<<30);
    L=1;
    l=0;
    p[0].f=0;
    p[0].s=0;
    pct[0].push_back(make_pair(a,b));
    while(fin>>c)
    {

        if(c==0)
        {
            fin>>a>>b;
            pct[L].push_back(make_pair(a,b));
            l++;
            p[l].f=a;
            p[l].s=b;
        }
        else
        {
            L++;
        }
    }
    L=L-2;
    for(i=0; i<=l; i++)
    {
        for(j=i+1; j<=l; j++)
        {
            dist[i][j]=(p[i].f-p[j].f)*(p[i].f-p[j].f)+(p[i].s-p[j].s)*(p[i].s-p[j].s);
            dist[j][i]=dist[i][j];
        }
    }
    nrrez=1;
    rez[0]=0;
    baza=1;
    for(niv=1; niv<=L; niv++)
    {
        for(i=1; i<=(1<<pct[niv].size())-1; i++)
        {
            for(j=0; j<pct[niv].size(); j++)
            {
                d[i][j]=pinf;
                if((i&(1<<j))==(1<<j))
                {
                    aux=i-(1<<j);
                    if(aux==0)
                    {
                        for(k=0; k<nrrez; k++)
                        {
                            d[i][j]=min(d[i][j],rez[k]+dist[k+baza-nrrez][j+baza]);
                        }
                    }
                    else
                    {
                        for(k=0; k<pct[niv].size(); k++)
                        {

                            if(((aux&(1<<k))==(1<<k)))
                            {

                                d[i][j]=min(d[i][j],d[aux][k]+dist[k+baza][j+baza]);
                            }
                        }
                    }
                }

            }
        }
        minn=pinf;
        i=(1<<pct[niv].size())-1;
        for(j=0; j<pct[niv].size(); j++)
        {
            rez[j]=d[i][j];
            minn=min(minn,d[i][j]);
        }
        fout<<minn<<'\n';
        baza=baza+pct[niv].size();
        nrrez=pct[niv].size();
    }
}