hdu 3605 Escape

hdu 3605 Escape

 1  /*
 2  http://acm.hdu.edu.cn/showproblem.php?pid=3605
 3  状态压缩+最大流
 4  每个人对于m个星球有1<<m种选择,把这些选择看成一个点
 5  开个数组存这些选择的个数
 6  然后构造最大流
 7  给出建图代码
 8  自己找个高效的最大流去吧
 9  */
10 
11  int  main() {
12 
13       int  da, i, j, ans, p, ss;
14       while ( ~ scanf( " %d %d " & n,  & m)) {
15 
16          memset(dp,  0 sizeof (dp));
17          p  =   1   <<  m;
18          s  =  p  +  m;
19          ans  =   0 ;
20          t  =  s  +   1 ;
21          N  =  t  +   1 ;
22          init();
23 
24           for (i  =   1 ; i  <=  n;  ++  i) {
25 
26              ss  =   0 ;
27               for (j  =   1 ; j  <=  m;  ++  j) {
28 
29                  scanf( " %d " & da);
30                  ss  =  (ss  <<   1 +  da;
31              }
32              dp[ ss ]  ++ ;
33          }
34 
35           for (i  =   0 ; i  <  p;  ++  i) {
36          
37              add(s, i, dp[ i ]);
38              add(i, s,  0 );
39          }
40 
41           for (i  =   0 ; i  <  p;  ++  i) {
42          
43               int  z  =  i;
44               int  cnt  =   0 ;
45               while (z) {
46              
47                   if (z  &   1 ) {
48                  
49                      add(i, cnt + p, dp[ i ]);
50                      add(cnt + p, i,  0 );
51                  }
52                  z  =  z  >>   1 ;
53                  cnt  ++ ;
54              }
55          }
56 
57           for (j  =   0 ; j  <  m;  ++  j) {
58 
59              scanf( " %d " & da);
60 
61              add(p + j, t, da);
62              add(t, p + j,  0 );
63          }
64 
65          sap(ans);
66           if (ans  ==  n) puts( " YES " );
67           else          puts( " NO " );
68      }
69       return   0 ;
70  }
71 

你可能感兴趣的:(hdu 3605 Escape)