简单记忆化搜索,用二进制位表示组队情况
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define MAX 8
#define INF 10000000
using namespace std;
int n,vis[1<<(2*MAX)],cases=1;
char name[MAX*2][25];
double x[MAX*2],y[MAX*2];
double dp[1<<(2*MAX)];
void init(){
memset(vis,0,sizeof(vis));
for(int i=0;i<(1<<(2*MAX));i++)
dp[i]=INF;
dp[(1<<(2*n))-1]=0.0;
}
double dist(int i,int j){
return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
void dfs(int team,int state){
if(vis[state]==1)
return ;
vis[state]=1;
if(team==n)
return ;
for(int i=0;i<n*2;i++){
if(state&(1<<i))
continue;
for(int j=i+1;j<n*2;j++){
if(state&(1<<j))
continue;
dfs(team+1,state+(1<<i)+(1<<j));
dp[state]=min(dp[state],dp[state+(1<<i)+(1<<j)]+dist(i,j));
}
}
}
int main(){
while(~scanf("%d",&n)&&n){
for(int i=0;i<2*n;i++){
scanf("%s %lf %lf",name[i],&x[i],&y[i]);
}
init();
dfs(0,0);
printf("Case %d: %.2lf\n",cases++,dp[0]);
}
return 0;
}