#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
double d[65537];
int n, des;
double dis[16][16];
int x[16], y[16];
const int inf = 100000000;
double f(int i, int j){
return sqrt(1.0 * ((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j])*(y[i] - y[j])));
}
double doit(int st){
if (d[st] != -1)return d[st];
if (st == des)return d[st] = 0;
d[st] = inf;
for (int i = 0; i < n; i++)if ((st & (1<<i)) == 0){
for (int j = 0; j < n; j++)if (j != i && (st & (1<<j)) == 0){
d[st] = min(d[st], dis[i][j] + doit(st | (1<<i) | (1<<j)));
}
}
return d[st];
}
int main(){
char s[30];
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
int ca = 1;
while (scanf("%d", &n) == 1 && n){
n *= 2;
des = 1;
int nu = 0;
while (nu < n){des *= 2;nu++;}
des--;
for (int i = 0; i < n; i++){
scanf("%s", s);
scanf("%d %d", x + i, y + i);
}
for (int i = 0; i < n; i++){
for (int j = i + 1; j < n; j++){
dis[i][j] = dis[j][i] = f(i, j);
}
}
for (int i = 0; i <= des; i++)d[i] = -1;
doit(0);
printf("Case %d: %.2f\n", ca++, d[0]);
}
return 0;
}
UVA 10911 Forming Quiz Teams(状态压缩DP)
最新推荐文章于 2012-10-31 23:16:00 发布