思路:从某一个点开始dfs得出每一个点的根节点有多少个

黑色数字代表点的编号 红色数字代表这个根节点的数量

当7的根节点数量就等于5 - 7这条边的右边点的数量 那么该边左边的数量就为n-根节点的数量

那么只要该点的根节点数量满足 k<ans<n-k ,那么就表示5 - 7这条边可以被全覆盖

依次类推,用dfs进行求,对每次dfs完之后的点进行判断即可。

AC_code:

#include<bits/stdc++.h>

using namespace std;

const int maxn = 200005;
 
int n, k;
vector<int> e[maxn];
void addedge(int u, int v){
	e[v].push_back(u);
	e[u].push_back(v);
}
int ans;
int size[maxn];
void init(){
	for(int i = 0; i <= n; i++){
		e[i].clear();
	}
}
int dfs(int u, int fa){
	size[u] = 1;
	for(int i = 0;i < e[u].size(); i++){
		if(e[u][i] == fa){
			continue;
		}
		else size[u] += dfs(e[u][i],u);
	}
	if(size[u] >= k && size[u] <= n-k){
		ans++;
	}
	return size[u];
}
int main(){
	//ios_base::sync_with_stdio(0);
	//cin.tie(0);
	int t;
	scanf("%d", &t);
	while(t--){
		ans = 0;
		init();
		scanf("%d%d", &n, &k);
		for(int i = 0; i < n - 1; i++){
			int a, b;
			scanf("%d%d",&a,&b);
			addedge(a,b);
		}
		dfs(1, -1);
		cout<<ans<<endl;
	}
}