WA 了,大概是用 ans 数组记录剩余联通数,如果 ≤1 就便历。
#include<bits/stdc++.h>
using namespace std;
const int maxn=4e5+5;
bool vis[maxn];
int t,n,k,sum,ans[maxn];
vector<int> G[maxn];
void cl(vector<int> &k){
vector<int> t;
swap(k,t);
}
void dfs(int i,int w){
if(vis[i]||w==k+1)
return;
sum--;
vis[i]=1;
for(int j=0,l=G[i].size();j<l;j++){
int c=ans[G[i][j]];
if(c<=1)
dfs(G[i][j],w+1);
ans[G[i][j]]--;
}
return;
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&k);
sum=n;
for(int i=1;i<=n;i++){
cl(G[i]);
vis[i]=ans[i]=0;
}
for(int i=1,u,v;i<n;i++){
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
for(int i=1;i<=n;i++){
ans[i]=G[i].size();
if(ans[i]<=1)
dfs(i,1);
}
printf("%d\n",sum);
}
return 0;
}