CF1337C(基本ツリーdp)

リノバと王国

アイデア:一番深いところが必要だと思うのは簡単です。一番深いところから選ぶのですが、最適な状態で工場を建てるところを選ぶという状況があり、この点息子が2人いて、この2人の息子も工場である必要があります。父親ノードが工場を設立したため、これらの2人の息子の工場の価値は1減少します。これは困難です。2人の息子の費用を転送するだけで済みます。 、2つの息子のポイントの値を維持し、失われる値を親ノードに与えます。これは、父ノードの値から2つの息子2によって失われた値を引いたものです。各ノードの値を維持するには、並べ替え、上位Kを選択します。ええ

1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <cstdio>
 5 #include <vector>
 6  
7  名前空間std を使用 8 9 #define fi first
 10 #define se second
 11 #define ll long long
 12 #define pb push_back 
 13 14 const int N =(int)2e5 + 10 ;
15 struct Tree {
 16 int depth;
17 
     
             int son;
18      int 値。
19      void cal(){
 20          value = depth- son;
21      }
 22      boolフレンド演算子 <(const Tree&a、const Tree&b){
 23          return a.value> b.value;
24      }
 25  } tree [N];
26 vector < int > G [N];
27  int n、k;
28  
29  void process(int now、int pre){
30      tree [now] .son = 1 ;
31      tree [now] .depth = tree [pre] .depth + 1 ;
32      forint to:G [now]){
 33          if(to == pre)continue ;
34          プロセス(に、今);
35          tree [now] .son + = tree [to] .son;
36      }
 37      tree [now] .cal();
38  }
 39  
40  void solve(){
 41      cin >> n >> k;
42      forint i = 1 ; i <n; ++i){
 43          int u、v;
44          cin >> u >> v;
45          G [u] .pb(v);
46          G [v] .pb(u);
47      }
 48      工程(10 );
49      sort(tree + 1、tree + 1 + n);
50      ll ans = 0 ;
51      forint i = 1 ; i <= k; ++ i){
 52          ans + = tree [i] .value;
53      }
 54      cout << ans <<endl;
55  }
 56  
57  int main(){
 58  
59      ios :: sync_with_stdio(false );
60      cin.tie(0 );
61      cout.tie(0 );
その62      (Page)
63  
64  
65      return  0 ;
66 }

 

おすすめ

転載: www.cnblogs.com/SSummerZzz/p/12721058.html