自认为这是这道题最简单的代码了。实在不理解为什么一个拓扑排序有的题解都要写上百行,还要DFS好几遍(逃)
#include<bits/stdc++.h>
#define N 800010
using namespace std;
int t,n,m,vis[N],in[N],ans;
int cnt,h[N];
queue<int>q;
struct eee{
int v,next;
}e[N];
void init(){
for(int i=1;i<=n;i++){
h[i]=0;
vis[i]=0;
in[i]=0;
}
cnt=0;
ans=0;
}
void add(int u,int v){
e[++cnt].v=v;
e[cnt].next=h[u];
h[u]=cnt;
}
void solve(){
int x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++){
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
in[x]++;
in[y]++;
}
for(int i=1;i<=n;i++){
if(in[i]==1){
vis[i]=1;
q.push(i);
}
}
while(!q.empty()){
x=q.front(),q.pop();
for(int i=h[x];i;i=e[i].next){
y=e[i].v;
in[y]--;
if(in[y]==1){
vis[y]=vis[x]+1;
q.push(y);
}
}
}
for(int i=1;i<=n;i++)
if(vis[i]>m)ans++;
printf("%d\n",ans);
}
int main(){
scanf("%d",&t);
while(t--){
solve();
init();
}
return 0;
}