洛谷P1433 吃奶酪
搜索 + 剪枝
这道题加了一个最优性剪枝就可以过了
其实还可以加一个剪枝
事先预处理好 任意两个点的距离
1 #include <cstdio> 2 #include <cmath> 3 using namespace std ; 4 5 int n ; 6 double x[ 16 ],y[ 16 ],dist[16][16] ; 7 double t,mi ; 8 bool f[16] ; 9 10 inline double sqr(double x) 11 { 12 return x*x ; 13 } 14 15 inline void dfs(int deep,int u,double sum) 16 { 17 if(deep>n) 18 { 19 if(sum<mi) mi = sum ; 20 return ; 21 } 22 for(int i=1;i<=n;i++) 23 if(!f[ i ]) 24 { 25 t = sum + dist[i][u] ; 26 if(t>=mi) continue ; 27 f[ i ] = 1 ; 28 dfs(deep+1,i,t) ; 29 f[ i ] = 0 ; 30 } 31 } 32 33 int main() 34 { 35 scanf("%d",&n) ; 36 mi = 1e9 ; 37 x[ 0 ] = 0 ; y[ 0 ] = 0 ; 38 for(int i=1;i<=n;i++) scanf("%lf%lf",&x[ i ],&y[ i ]) ; 39 for(int i=0;i<=n;i++) 40 for(int j=0;j<=n;j++) 41 dist[ i ][ j ] = sqrt( sqr(x[i]-x[j]) + sqr(y[i]-y[j]) ) ; 42 dfs(1,0,0) ; 43 printf("%.2lf",mi) ; 44 return 0 ; 45 }