思路:从某一个点开始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;
}
}