アイデア:一番深いところが必要だと思うのは簡単です。一番深いところから選ぶのですが、最適な状態で工場を建てるところを選ぶという状況があり、この点息子が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 for(int 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 for(int 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 工程(1、0 ); 49 sort(tree + 1、tree + 1 + n); 50 ll ans = 0 ; 51 for(int 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 }