设dp[x]表示x节点,能够向上控制几个节点。欠控制时,为负。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100100;
int dp[MAXN];
vector<int> vec[MAXN];
int ans,k;
int dfs(int x,int fa)
{
int mn=1<<30,mx=-(1<<30);
for(int i=0;i<vec[x].size();i++)
{
if(vec[x][i]==fa)
continue;
dfs(vec[x][i],x);
mn=min(mn,dp[vec[x][i]]);
mx=max(mx,dp[vec[x][i]]);
}
if(mn==(1<<30))
dp[x]=-1;
else if(mn<=-k)
{
ans++;
dp[x]=k;
}
else if(mn+mx>0)
dp[x]=mx-1;
else
dp[x]=mn-1;
}
int main()
{
int n,i,u,v;
while(~scanf("%d%d",&n,&k))
{
for(i=0;i<n;i++)
vec[i].clear();
for(i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
vec[u].push_back(v);
vec[v].push_back(u);
}
if(k==0)
{
printf("%d\n",n);
continue;
}
ans=0;
dfs(1,-1);
if(dp[1]<0)
ans++;
printf("%d\n",ans);
}
}