Cod sursa(job #2216184)

Utilizator Andrei_CotorAndrei Cotor Andrei_Cotor Data 25 iunie 2018 19:35:39
Problema Bibel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<fstream>
#define INF 1000000000
using namespace std;
ifstream fi("bibel.in");
ofstream fo("bibel.out");
int n,pn,x,Dp[131077][25],i,j,k,rez,X[25],Y[25],Xp[25],Yp[25],DPrv[25];

int dist(int x, int y, int xx, int yy)
{
    return ((x-xx)*(x-xx)+(y-yy)*(y-yy));
}

int main()
{
    pn=1;
    while(1)
    {
        fi>>x;
        if(x==0)
        {
            n++;
            fi>>X[n]>>Y[n];
        }
        if(x==1)
        {
            for(i=1; i<(1<<n); i++)
                for(j=1; j<=n; j++)
                    Dp[i][j]=INF;
            for(i=1; i<=pn; i++)
                for(j=1; j<=n; j++)
                    Dp[(1<<(j-1))][j]=min(Dp[(1<<(j-1))][j],DPrv[i]+dist(Xp[i],Yp[i],X[j],Y[j]));
            for(i=1; i<(1<<n); i++)
                for(j=1; j<=n; j++)
                    if(i&(1<<(j-1)))
                        for(k=1; k<=n; k++)
                            if(k!=j && (i&(1<<(k-1))))
                                Dp[i][j]=min(Dp[i][j],Dp[i^(1<<(j-1))][k]+dist(X[j],Y[j],X[k],Y[k]));
            rez=INF;
            for(i=1; i<=n; i++)
            {
                rez=min(rez,Dp[(1<<n)-1][i]);
                DPrv[i]=Dp[(1<<n)-1][i];
                Xp[i]=X[i];
                Yp[i]=Y[i];
            }
            pn=n;
            n=0;
            fo<<rez<<"\n";
        }
        if(x==2)
            break;
    }
    fi.close();
    fo.close();
    return 0;
}