#include <bits/stdc++.h>
using namespace std;
int mx,n,x[20],y[20];
double dist[20][20],dp[1<<16];
double call(int pos)
{
if(pos==mx)
return 0;
else if(dp[pos]!=-1)
return dp[pos];
else
{
int i,j;
double d=1<<30;
for(i = 0; i<2*n; i++)
{
if(!(pos&(1<<i)))
{
for(j=i+1; j<2*n; j++)
{
if(!(pos&(1<<j)))
{
d = min(d,dist[i][j]+call(pos|(1<<i)|(1<<j)));
}
}
}
}
return dp[pos]=d;
}
}
double dis(int i, int j)
{
return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
int main()
{
char name[20];
int i,j,cs=1;
scanf("%d",&n);
while(n)
{
mx = (1<<(2*n))-1;
for(i=0; i<2*n; i++)
scanf("%s %d %d",name,x+i,y+i);
for(i=0; i<2*n; i++)
for(j=i+1; j<2*n; j++)
dist[i][j]=dist[j][i]=dis(i,j);
for(i=0; i<=mx; i++)
dp[i]=-1;
printf("Case %d: %.2lf\n",cs++,call(0));
scanf("%d",&n);
}
return 0;
}
using namespace std;
int mx,n,x[20],y[20];
double dist[20][20],dp[1<<16];
double call(int pos)
{
if(pos==mx)
return 0;
else if(dp[pos]!=-1)
return dp[pos];
else
{
int i,j;
double d=1<<30;
for(i = 0; i<2*n; i++)
{
if(!(pos&(1<<i)))
{
for(j=i+1; j<2*n; j++)
{
if(!(pos&(1<<j)))
{
d = min(d,dist[i][j]+call(pos|(1<<i)|(1<<j)));
}
}
}
}
return dp[pos]=d;
}
}
double dis(int i, int j)
{
return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
int main()
{
char name[20];
int i,j,cs=1;
scanf("%d",&n);
while(n)
{
mx = (1<<(2*n))-1;
for(i=0; i<2*n; i++)
scanf("%s %d %d",name,x+i,y+i);
for(i=0; i<2*n; i++)
for(j=i+1; j<2*n; j++)
dist[i][j]=dist[j][i]=dis(i,j);
for(i=0; i<=mx; i++)
dp[i]=-1;
printf("Case %d: %.2lf\n",cs++,call(0));
scanf("%d",&n);
}
return 0;
}
কোন মন্তব্য নেই:
একটি মন্তব্য পোস্ট করুন