洛谷P1433 吃奶酪 搜索 + 剪枝

洛谷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 }

 

posted @ 2017-06-27 10:33  third2333  阅读(158)  评论(0编辑  收藏  举报