Cod sursa(job #2374169)

Utilizator dacianouaPapadia Mortala dacianoua Data 7 martie 2019 17:19:02
Problema Bibel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
#include <math.h>
#include <string.h>
#define nmax 17
#define inf 0x3f3f3f3f
using namespace std;
ifstream fin("bibel.in");
ofstream fout("bibel.out");
int xp[nmax+5],yp[nmax+5],x[nmax+5],y[nmax+5],DPp[nmax+5],DP[1<<(nmax+1)][nmax+5],n,np,c,sol;
int dist(int x1,int y1,int x2, int y2)
{
    return ((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
int minv(int x,int y)
{
    return x<y?x:y;
}
int main()
{
    np=1;
    while(true)
    {
        fin>>c;
        if(c==0)
            ++n,fin>>x[n]>>y[n];
        if(c==1)
        {
            memset(DP,inf,sizeof(DP));
            for(int i=1;i<=np;i++)
                for(int j=1;j<=n;j++)
                DP[1<<(j-1)][j]=minv(DP[1<<(j-1)][j],DPp[i]+dist(xp[i],yp[i],x[j],y[j]));
            for(int i=1;i<(1<<n);i++)
                for(int j=1;j<=n;j++)
                if(i&(1<<(j-1)))
                    for(int k=1;k<=n;k++)
                    if(k!=j && (i&(1<<(k-1))))
                    DP[i][j]=minv(DP[i][j],DP[i^(1<<(j-1))][k]+dist(x[j],y[j],x[k],y[k]));
           sol=inf;
           for(int i=1;i<=n;i++)
           {
               sol=minv(sol,DP[(1<<n)-1][i]);
               DPp[i]=DP[(1<<n)-1][i];
               xp[i]=x[i];
               yp[i]=y[i];
           }
           np=n;
           n=0;
           fout<<sol<<"\n";
        }
        if(c==2)
            break;
    }
    return 0;
}