#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int dp[maxn];
vector <int> V[maxn];
int N,K;
int vis[maxn];
int dfs(int n)
{
static int ans = 0;
int Min = maxn;
int Max = -maxn;
//vis[n] = true;
int len = V[n].size();
for(int i=0;i<len;i++){
//if(!vis[V[n][i]]){
dfs(V[n][i]);
Min = min(Min,dp[V[n][i]]);
Max = max(Max,dp[V[n][i]]);
//}
}
if(Min == maxn){
dp[n] = -1;
}
else if(Min <= -K){
++ans;
dp[n] = K;
}
else if(Min + Max > 0){
dp[n] = Max - 1;
}
else{
dp[n] = Min - 1;
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin>>N>>K;
for(int i=1;i<N;i++) {
int s,e;
cin>>s>>e;
V[s].push_back(e);
V[e].push_back(s);
}
if(!K){
cout<< N <<endl;
return 0;
}
int ans = dfs(0);
cout<< (dp[0] < 0 ? ans+1 : ans) <<endl;
return 0;
}
/***
4 1
0 1
0 2
0 3
5 1
0 1
0 2
0 3
3 4
***/
51NOD1378 树形DP + 贪心
最新推荐文章于 2020-03-08 19:50:52 发布