#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
const int N=100010;
vector<int> Tree[N];
int d;
int ans;
int vis[N];
void bfs(int u){
ans++;
vis[u]=1;
int ceng=0;
int end=u;
int w=u;
queue<int> Q;
Q.push(u);
while(!Q.empty()){
int v=Q.front();Q.pop();
if(v==w){
ceng++;
//printf("v = %d, ceng = %d\n", v, ceng);
}
for(int i=0;i<Tree[v].size();++i){
if(!vis[Tree[v][i]]){
vis[Tree[v][i]]=1;
Q.push(Tree[v][i]);
//if(v==w)
{
end=Tree[v][i];
//printf("end = %d\n", end);
}
ans++;
}
}
if(v==w){
//printf("v=%d,w=%d,ceng=%d,ans=%d\n",v,w,ceng,ans);
w=end;
//printf("w = %d\n", w);
}
if(ceng==d)break;
}
}
int main(){
int T;
cin>>T;
int n;
int a,b;
while(T--){
cin>>n>>d;
ans=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<N;i++)Tree[i].clear();
for(int i=0;i<n-1;i++){
scanf("%d%d",&a,&b);
Tree[a].push_back(b);
Tree[b].push_back(a);
}
bfs(0);
printf("%d\n",n-ans);
}
return 0;
}
记录一个找了好久的bug
记录层数的时候用w存储上一层最后一个节点
end记录本层最后一个节点(未注释掉if(v==w)时,只有到上一层最后一个节点被取出的时候才去更新end,但此时可能没有子节点,未更新end)