Cod sursa(job #1024179)

Utilizator thewildnathNathan Wildenberg thewildnath Data 8 noiembrie 2013 12:44:11
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<stdio.h>
#include<math.h>
#include<string.h>
#define eps 1.e-14
#define INF 2000000000.

double dist[22][22],d[1<<16];
int x[20],y[20];
char aux[22];

inline double min(double a,double b)
{return a<b?a:b;}

int main()
{
    //freopen("date.in","r",stdin);
    //freopen("date.out","w",stdout);
    int n,i,j,max,p1,p2,t=0;

    while(1)
    {
        scanf("%d\n",&n);
        if(n==0)
            break;
        ++t;
        max=2*n;
        for(i=0;i<max;++i)
            scanf("%s%d%d\n",&aux,&x[i],&y[i]);

        for(i=0;i<max;++i)
            for(j=i+1;j<max;++j)
                dist[i][j]=dist[j][i]=sqrt((x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]) );

        int ns=(1<<(2*n));

        for(i=1;i<ns;++i)
        {
            d[i]=INF;
            for(p1=0;p1<max;++p1)
                for(p2=p1+1;p2<max;++p2)
                    if((i&(1<<p1)) && (i&(1<<p2)))
                        {
                            j=i^(1<<p1)^(1<<p2);
                            d[i]=min(d[i],d[j]+dist[p1][p2]);
                        }
        }
        printf("Case %d: %.2lf\n",t,d[ns-1]);



    }

    return 0;
}