Cod sursa(job #1071356)

Utilizator andrettiAndretti Naiden andretti Data 2 ianuarie 2014 22:08:42
Problema Bibel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<stdio.h>
#include<algorithm>
#include<cstring>
#define maxn 20
#define maxm 1<<18
#define inf 0x3f3f3f3f
using namespace std;

struct point{int x,y;} a[maxn],L[maxn];
int n,sol,Ln;
int d[maxn][maxn],Lv[maxn];
int s[maxm][maxn];

int dist(point a,point b){
    return ((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

void solve()
{
    for(int i=0;i<n-1;i++)
     for(int j=i+1;j<n;j++)
      d[i][j]=d[j][i]=dist(a[i],a[j]);

    for(int i=0;i<(1<<n);i++)
     for(int j=0;j<n;j++)
       s[i][j]=inf;

    for(int i=0;i<n;i++)
     for(int j=0;j<Ln;j++)
      s[1<<i][i]=min(s[1<<i][i],Lv[j]+dist(L[j],a[i]));

    for(int i=0;i<(1<<n);i++)
     for(int j=0;j<n;j++)
      if( (i>>j)&1 )
       for(int k=0;(i>>k);k++)
         if( ((i>>k)&1) )
            s[i][j]=min(s[i][j],s[i^(1<<j)][k]+d[k][j]);

     sol=inf;
     for(int i=0;i<n;i++) sol=min(sol,s[(1<<n)-1][i]),Lv[i]=s[(1<<n)-1][i];
     memcpy(L,a,sizeof(a));
     printf("%d\n",sol); Ln=n;
}

void read()
{
    int type; Ln=1; L[0].x=L[0].y=0;
    for(scanf("%d",&type);type!=2;scanf("%d",&type))
    {
        if(!type)
        {
            scanf("%d%d",&a[n].x,&a[n].y);n++;
            continue;
        }
        solve(); n=0;
    }
}

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

    read();

    fclose(stdin);
    fclose(stdout);
    return 0;
}