题解:
先跑遍dfs从深度最高点出发任何修改他的父亲节点,向上走就减减,那么发现减到-K那么显然必须放一个coffee,最后再特判一下1为不为-或者没走到过
#include<bits/stdc++.h>
using namespace std;
long long read(){
long long num=0;
char ch=getchar();
while(ch>'9'||ch<'0'){
ch=getchar();
}
while(ch>='0'&&ch<='9'){
num=(num<<1)+(num<<3)+ch-'0';
ch=getchar();
}
return num;
}
long long n,m,tot,k,cnt,ans;
int head[1000010];
int ver[2000010];
int next[2000010];
int f[1000010];
int cx[1000010];
int v[1000010];
int vis[1000010];
queue<int>q;
void add(int x,int y){
ver[++tot]=y;
next[tot]=head[x];
head[x]=tot;
}
void bfs(){
f[1]=1;
cx[++cnt]=1;
q.push(1);
while(q.size()){
int x=q.front();
q.pop();
for(int i=head[x];i;i=next[i]){
if(f[ver[i]]) continue;
f[ver[i]]=x;
cx[++cnt]=ver[i];
q.push(ver[i]);
}
}
}
int rr(int a,int b){
if(a<b) swap(a,b);
if(abs(a)>=abs(b)) return a;
return b;
}
int main(){
n=read();
k=read();
for(int i=1;i<n;i++){
int x=read(),y=read();
add(x,y);
add(y,x);
}
bfs();
f[1]=0;
for(int i=n;i;i--){
int x=cx[i];
if(v[x]==-k){
v[x]=k;
ans++;
}
if(v[x]==0&&vis[x]) continue;
else{
v[f[x]]=rr(v[f[x]],v[x]-1);
if(!v[f[x]]) vis[f[x]]=1;
}
}
if(v[1]<0||(v[1]==0&&vis[1]==0)) ans++;
printf("%d",ans);
}