https://blog.csdn.net/lxglbk/article/details/6674270
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define MAXN 1111111
#define INF 0x3fffffff
struct Point {
double x, y;
} node[22];
int n;
double status[MAXN];
double dist(Point a, Point b) {
return sqrt((a.x-b.x)*(a.x-b.x)
+(a.y-b.y)*(a.y-b.y));
}
bool nodecmp(const Point a, const Point b) {
return dist(node[0], a) < dist(node[0], b);
}
double min(double x, double y) {
return x < y ? x : y;
}
double dfs(int sta, int cnum) {
if(status[sta] != -1)
return status[sta];
if(cnum == n)//干掉了n对人
return 0;
int pos = -1;
int temp = sta;
status[sta] = INF;
for(int c = 1; temp; temp >>= 1, c++) {
if(temp & 1) {
if(pos == -1)//确定第一点
pos = c;
else//到了第二点
status[sta] = min(status[sta], dfs(sta-(1<<(pos-1))-(1<<(c-1)), cnum+1)
+ dist(node[0], node[pos]) + dist(node[pos], node[c]));
}
}
return status[sta];
}
int main() {
freopen("data.in", "r", stdin);
int t, casenum;
int i, upper;
scanf("%d", &t);
for(casenum = 1; casenum <= t; casenum++) {
scanf("%lf %lf", &node[0].x, &node[0].y);
scanf("%d", &n);
upper = n<<1;
for(i = 1; i <= upper; i++) {
scanf("%lf %lf", &node[i].x, &node[i].y);
}
sort(node+1, node+1+upper, nodecmp);
memset(status, -1, sizeof(status));
double ans = dfs((1<<upper)-1, 0);//倒推 关键 避免超时
printf("Case #%d: %.2lf\n",casenum, ans);
}
return 0;
}