深搜加剪纸可A(O(玄学) 1274ms)
——代码
1 #include <cmath> 2 #include <cstdio> 3 #include <iostream> 4 5 int n; 6 double ans = ~(1 << 31), a[16], b[16]; 7 bool vis[16]; 8 9 inline double min(double x, double y) 10 { 11 return x < y ? x : y; 12 } 13 14 inline double query(int x, int y) 15 { 16 return sqrt((a[x] - a[y]) * (a[x] - a[y]) + (b[x] - b[y]) * (b[x] - b[y])); 17 } 18 19 inline void dfs(int now, double sum, int k) 20 { 21 if(k == n + 1) 22 { 23 ans = min(ans, sum); 24 return; 25 } 26 if(sum > ans) return; 27 for(int i = 1; i <= n; i++) 28 if(!vis[i]) 29 { 30 vis[i] = 1; 31 dfs(i, sum + query(now, i), k + 1); 32 vis[i] = 0; 33 } 34 } 35 36 int main() 37 { 38 scanf("%d", &n); 39 for(int i = 1; i <= n; i++) scanf("%lf %lf", &a[i], &b[i]); 40 dfs(0, 0, 1); 41 printf("%.2lf\n", ans); 42 return 0; 43 }