Cod sursa(job #2676606)

Utilizator DavidAA007Apostol David DavidAA007 Data 24 noiembrie 2020 17:51:52
Problema Bibel Scor 85
Compilator cpp-64 Status done
Runda simusimu Marime 1.38 kb
#include <iostream>
#include <fstream>
#define INF 1999999999999
using namespace std;
ifstream fin("bibel.in");
ofstream fout("bibel.out");
int niv=1;
long long int x[20], y[20], x0[20], y00[20];
int n,i,j,k;
int dist(long long int x1, long long int y1, long long int x2, long long int y2)
{
    return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
}
int pr;
long long int d[1<<17][20];
int sol()
{
    if(niv==1)
        pr=n;
    for(i=1;i<=(1<<n);++i)
        for(j=0;j<n;++j)
            d[i][j]=INF;
    for(j=0;j<pr; j++)
        for(i=0;i<n;i++)
            d[1<<i][i]=min(d[1<<i][i],d[0][j]+dist(x[i],y[i],x0[j],y00[j]));
    for(i=1;i<(1<<n);i++)
        for(j=0;j<n;j++)
            if(i&(1<<j))
                for(k=0;k<n;k++)
                    if(i&(1<<k) && k!=j)
                        d[i][j]=min(d[i][j],d[i^(1<<j)][k]+dist(x[k],y[k],x[j],y[j]));
    long long ans=INF;
    for(i=0;i<n;i++)
    {
        ans=min(ans,d[(1<<n)-1][i]);
        x0[i]=x[i];
        y00[i]=y[i];
        d[0][i]=d[(1<<n)-1][i];
    }
    pr=n;
    return ans;
}
int main()
{
    int a;
    bool done=false;
    while(!done)
    {
        fin>>a;
        if(a==0)
        {
            fin>>x[n]>>y[n];
            n++;
        }
        if(a==1)
        {
            fout<<sol()<<"\n";
            n=0;
            niv++;
        }
        if(a==2)
            done=true;
    }
    fin.close();
    fout.close();
    return 0;
}