可以证明只要叶子两两路径满足条件即可,于是便可以贪心啦,从最外圈(叶子)开始一层一层选,选出前 k/2 层。
如果k是奇数的话,还可以多选一个不是前 k/2 层的点。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define pb push_back
const int N=1e6+5;
inline int read(){
int x=0; char ch=getchar();
for(;!isdigit(ch);ch=getchar());
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
return x;
}
vector<int> g[N];
queue<int> q;
int n,k,len[N],ans,l,d[N];
bool flag;
inline void solve(){
for(int x;!q.empty();q.pop()){
x=q.front();
for(int j=g[x].size()-1,i;j>=0;j--){
i=g[x][j]; if((--d[i])==1) q.push(i),len[i]=len[x]+1;
}
}
}
int main(){
n=read(),k=read(),l=k>>1;
for(int i=1,uu,vv;i<n;i++){
uu=read(),vv=read(),d[uu]++;
g[uu].pb(vv),g[vv].pb(uu),d[vv]++;
}
for(int i=1;i<=n;i++) if(d[i]==1) q.push(i),d[i]--;
solve();
for(int i=1;i<=n;i++) if(len[i]<l) ans++; else flag=1;
ans+=(k&1)&flag,printf("%d
",ans);
return 0;
}