#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e6 + 5;
//思路很重要,思路错了越想越错
int cnt[N];
int d[N];
int n;
int main(){
int T;
scanf("%d",&T);
int a,b;
while(T--){
scanf("%d",&n);
if(n == 1){
printf("1\n");
continue;
}
//memset(cnt,0,sizeof (cnt));
for(int i=1;i<=n;i++) cnt[i]=0;
for(int i=1;i<n;i++){
scanf("%d%d",&a,&b);
cnt[a]++;
cnt[b]++;
}
int res=0;
for(int i=1;i<=n;i++){
if(cnt[i] == 1){
res++;
}
}
printf("%d\n",res);
}
return 0;
}
求解:为什么memset清数组,就过不了,而用for一个一个的循环清就过了
显然只有叶子结点一定不会被操作1删除,更普遍的来说,所有度数为1的点其实都不可能被操作1删除。所有度数为2或者更多的点都可以被操作1删除,因此答案就是树的度数为1的节点数量,其中要特判1的情况。(引用自2022 ICPC 网络赛第一场题解A C D H J L - 知乎 (zhihu.com))