传送门 :
一开始想到了拓扑排序 但是拓扑是对一个点,所以还是想着中心根深度继续走
我们对于每一个叶子节点 对其连接的节点的度数 − 1 -1 −1 进行拓扑操作
然后我们在操作的时候 同时记录一下,这是第几轮被删除的节点
最后对节点进行一遍 前缀和 输出即可
#include <bits/stdc++.h>
using namespace std;
#define ned '\n'
#define pb push_back
const int N = 4e5+10;
vector<int> save[N];
vector<int> v;
int in[N];
int val[N];
int cnt[N];
int n,k;
void init()
{
for(int i = 0;i<=n;i++)
{
save[i].clear();
val[i] = 0;
cnt[i] = 0 ;
in[i] = 0;
}
v.clear();
}
void solve()
{
//int n,k;
init();
cin>>n>>k;
if(n == 1)
{
cout<<0<<ned;
return;
}
for(int i=1; i<=n-1; i++)
{
int a,b;
cin>>a>>b;
save[a].pb(b);
save[b].pb(a);
in[a]++,in[b]++;
}
int tot = 0,c=1;
for(int i=1; i<=n; i++)
if(in[i] == 1)
v.pb(i);
///存第一遍 所有叶子节点
while(tot<n)
{
vector<int> v2;
tot+=v.size();
for(auto it : v)
{
val[it] = c;
for(auto it2 : save[it])
{
--in[it2];
if(in[it2] == 1)
v2.pb(it2);
}
}
v = v2;
c++;
}
for(int i=1; i<=n; i++)
cnt[val[i]] ++;
for(int i=1; i<=n; i++)
cnt[i] += cnt[i-1];
if(k>n)
cout<<0<<ned;
else
cout<<n-cnt[k]<<ned;
}
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t -- )
solve();
return 0;
}