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; }