10911
dp着往下搜就行,每次搜一对,不断更新;
但是一开始就是TLE。。。。不过有一点小剪枝一下就过了。。2.988s
//============================================================================
// Name : 10911.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
typedef struct{
char name[100];
double x, y;
}Node;
Node a[20];
double d[20][20];
int n;
int flag[20];
double ans;
long long num;
double dp(int m){
// num++;
// printf("%d :n ", m);
// for(int i = 1;i <= 2*n;i++){
// printf("%d ", flag[i]);
// }
// printf("\n");
int t;
double temp, curans;
for(int i = 1;i <= 2*n;i++){
if(flag[i] == 0){
t = i;
flag[i] = 1;
break;
}
}
if(m == n){
for(int i = 1;i <= 2*n;i++){
if(flag[i] == 0){
temp = d[t][i];
// printf("%.2lf\n", temp);
flag[t] = 0;
return temp;
}
}
}
int tag = 0;
for(int i = 1;i <= 2*n;i++){
if(flag[i] == 0&&tag == 0){
tag = 1;
flag[i] = 1;
curans = d[t][i] + dp(m+1);
flag[i] = 0;
}
else if(flag[i] == 0){
if(d[t][i] > curans) continue;
flag[i] = 1;
temp = d[t][i] + dp(m+1);
flag[i] = 0;
if(temp < curans){
curans = temp;
}
}
}
flag[t] = 0;
return curans;
}
int main() {
freopen("a.txt", "r", stdin);
int T = 0;
while(scanf("%d", &n)&&n){
T++;
printf("Case %d: ", T);
for(int i = 1;i <= 2*n;i++){
scanf("%s", a[i].name);
scanf("%lf%lf", &a[i].x, &a[i].y);
}
for(int i = 1;i <= 2*n;i++){
for(int j = 1;j <= 2*n;j++){
if(i == j){
d[i][j] = 0.0;
}
else{
d[i][j] = sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));
}
}
}
// for(int i = 1;i <= 2*n;i++){
// for(int j = 1;j <= 2*n;j++){
// printf("%.2lf ", d[i][j]);
// }
// printf("\n");
// }
memset(flag, 0, sizeof(flag));
ans = dp(1);
printf("%.2lf\n", ans);
// printf("%lld\n", num);
}
return 0;
}

浙公网安备 33010602011771号