Cod sursa(job #541996)

Utilizator testreTester IA testre Data 25 februarie 2011 17:31:14
Problema Bibel Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<stdio.h>
#include<algorithm>
const int nr=1000000000;
using namespace std;
int i,j,k,l,n,m,car,d[131075][18],sol,b[18],p=1;
struct cord
{
    int i,j;
};
int dist(int x1,int y1,int x2,int y2)
{
    return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}
cord v[20],a[20];
int main()
{
    freopen("bibel.in","r",stdin);
    freopen("bibel.out","w",stdout);
    while(car!=2)
    {
        k=0;
        scanf("%d",&car);
        if(car==2)break;
        while(car!=1)
        {
            scanf("%d%d",&v[k].i,&v[k].j);
            scanf("%d",&car);
            k++;
        }
        for(i=0;i<(1<<k);i++)
            for(j=0;j<k;j++)
            d[i][j]=nr;
        for(i=0;i<k;i++)
            for(j=0;j<p;j++)
            if(a[j].i==v[i].i&&a[j].j==v[i].j){}else
            d[(1<<i)][i]=min(b[j]+dist(a[j].i,a[j].j,v[i].i,v[i].j),d[(1<<i)][i]);
        for(i=0;i<(1<<k);i++)
            for(j=0;j<k;j++)
                if(i&(1<<j))
                    for(l=0;l<k;l++)
                        if((i&(1<<l))==0)
                            d[i+(1<<(l))][l]=min(d[i+(1<<(l))][l],d[i][j]+dist(v[j].i,v[j].j,v[l].i,v[l].j));
        sol=nr;
        for(i=0;i<k;i++)
        {
            sol=min(sol,d[(1<<k)-1][i]);
            b[i]=d[(1<<k)-1][i];
            a[i].i=v[i].i;
            a[i].j=v[i].j;
            p=k;
        }
        printf("%d\n",sol);
    }
    return 0;
}