Description

Input

Output

Sample Input
1
7
1 2
2 3
2 4
4 6
5 6
6 7
7
1 2
2 3
2 4
4 6
5 6
6 7
Sample Output
3
HINT
题解:记录一下每个节点是否被穿过覆盖.从下往上贪心即可.
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 10010
using namespace std;
int point[N],next[N<<1],v[N],f[N],T,cnt,n,x,y,ans;
struct use{
int st,en;
}e[N<<1];
void add(int x,int y){
next[++cnt]=point[x];point[x]=cnt;e[cnt].en=y;
}
void dfs(int x,int fa){
int t(0),sum(0);
for (int i=point[x];i;i=next[i])
if (e[i].en!=fa){
dfs(e[i].en,x);
if (!f[e[i].en]) t++;
sum+=v[e[i].en];
}
if (t>=2){v[x]=sum-1;f[x]=1;}
if (t==1) v[x]=sum;
if (t==0) v[x]=sum+1;
}
int main(){
scanf("%d",&T);
while (T--){
memset(point,0,sizeof(point));
memset(v,0,sizeof(v));
memset(f,0,sizeof(f));
scanf("%d",&n);cnt=0;
for (int i=1;i<n;i++){
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
dfs(1,0);
//for (int i=1;i<=n;i++) cout<<i<<' '<<v[i]<<endl;
cout<<v[1]<<endl;
}
}