Cod sursa(job #1653024)

Utilizator SilviuIIon Silviu SilviuI Data 15 martie 2016 17:55:42
Problema Bibel Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

struct date { int x,y; };

int tip,n;
int dp[20][1<<18];
date v[20];

int sqr(int x) { return x*x; }

int dist(int x,int y)
{
    return sqr(v[x].x-v[y].x)+sqr(v[x].y-v[y].y);
}

int memo(int nod,int mask)
{
    if (mask==(1<<n)-1) return 0;

    if (dp[nod][mask]!=2e9) return dp[nod][mask];

    int sol=2e9;

    for (int i=1;i<=n;i++)
        if (((mask>>(i-1))&1)==0) sol=min(sol,memo(i,mask+(1<<(i-1)))+dist(nod,i));

    return dp[nod][mask]=sol;
}

int main()
{
    freopen("bibel.in","r",stdin);
    freopen("bibel.out","w",stdout);

    n=1; v[1].x=v[1].y=0;

    while (1) {
        scanf("%d",&tip);

        if (tip==0) { n++; scanf("%d %d",&v[n].x,&v[n].y); } else
           if (tip==1) {

               for (int i=1;i<=n;i++)
                   for (int j=0;j<1<<n;j++)
                       dp[i][j]=2e9;

               dp[1][1]=memo(1,1);

               printf("%d\n",dp[1][1]);

               n=1;
           }

        if (tip==2) return 0;
    }

    return 0;
}