URAL 1039. Anniversary party

URAL 1039. Anniversary party
树形DP,用数组邻接表空间不够,于是将树转化为二叉树AC
 1  #include  < iostream >
 2  using   namespace  std;
 3  const   int  maxn = 6011 ;
 4  int  n;
 5  int  happy[maxn];
 6  int  link[maxn][ 2 ];
 7  int  q[maxn],st,en;
 8  int  f[maxn],g[maxn];
 9  bool  le[maxn];
10  void  bfs( int  x){
11      q[ ++ en] = x;
12       while  (st < en){
13           ++ st;
14           int  nx = q[st];
15           int  ns = link[nx][ 0 ];
16           while  (ns != 0 ){
17               ++ en;
18              q[en] = ns;
19              ns = link[ns][ 1 ];
20              }
21          }
22      }
23      
24  int  max( int  a, int  b){
25       return  a > b ? a:b;
26      }
27      
28  void  work( int  x){
29      f[x] = happy[x];
30      g[x] = 0 ;
31       int  ns = link[x][ 0 ];
32       while  (ns != 0 ){
33          f[x] += g[ns];
34          g[x] += max(g[ns],f[ns]);
35          ns = link[ns][ 1 ];
36          }
37      }
38      
39  void  init( int  a, int  b){
40       if  (link[a][ 0 ] == 0 ) link[a][ 0 ] = b;
41       else {
42           int  ns = link[a][ 0 ];
43           while  (link[ns][ 1 ] != 0 ) ns = link[ns][ 1 ];
44          link[ns][ 1 ] = b;
45          }
46      }
47      
48  int  main(){
49      scanf( " %d " , & n);
50       for  ( int  i = 1 ;i <= n; ++ i) scanf( " %d " , & happy[i]);
51       int  a,b;
52      scanf( " %d %d " , & a, & b);
53       while  (a != 0 ){
54          init(b,a);
55          le[a] = true ;
56          scanf( " %d %d " , & a, & b);
57          }
58       for  ( int  i = 1 ;i <= n; ++ i)  if  ( ! le[i]) bfs(i);
59       for  ( int  i = n;i > 0 ; -- i) work(q[i]);
60       int  ans = 0 ;
61       for  ( int  i = 1 ;i <= n; ++ i)  if  ( ! le[i]) ans += max(f[i],g[i]);
62      cout << ans;
63      }
64 

你可能感兴趣的:(URAL 1039. Anniversary party)