题意:
给k个颜色 将树进行染色, 染色后相同的两个点的之间的边的交集最大, 当然了 有的点不用的话 那么就是空集了, 这肯定是不行的 q w q qwq qwq
考虑枚举每一条边, 也就是 一个点的左右子树,如果两个子树的 s z sz sz都大于 k k k的话,那当然就是可以的啦
#include <bits/stdc++.h>
using namespace std;
#define cpp_io() {ios::sync_with_stdio(false); cin.tie(NULL);}
#define rep(i,a,n) for (int i=a;i<n;i++)
#define repp(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define CLR(a,b) memset(a,(b),sizeof(a))
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ls o<<1
#define rs o<<1|1
typedef long long ll;
typedef vector<int> VI;
const int MAXN = (int)2e5+10;
const int INF = 0x3f3f3f3f;
const int mod = (int)1e9+7;
void F() {
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
}
vector<int>E[MAXN];
int cnt[MAXN];
int n,k;
int ans;
void dfs(int u,int fa) {
cnt[u]=1;
rep(i,0,SZ(E[u])){
int v=E[u][i];
if(v==fa) continue;
dfs(v,u);
cnt[u]+=cnt[v];
if(cnt[v]>=k&&n-cnt[v]>=k) ans++;
}
}
int main(int argc, char const *argv[])
{
cpp_io(); F();
int T; cin>>T;
while(T--){
CLR(cnt,0);
cin>>n>>k;
rep(i,1,n){
int u,v;
cin>>u>>v;
E[u].pb(v); E[v].pb(u);
}
ans=0;
dfs(1,0);
cout<<ans<<endl;
repp(i,1,n) E[i].clear();
}
return 0;
}