Description
Input
Output
Sample Input
1
7
1 2
2 3
2 4
4 6
5 6
6 7
Sample Output
3
HINT
Source
Play with Tree By Amber
贪心一下
让一个覆盖的路径尽可能覆盖更多的点,于是从儿子到父亲要尽可能的覆盖上.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 10010
#define GET (ch>='0'&&ch<='9')
using namespace std;
int T,n,top;
int sum;
int f[MAXN];
bool vis[MAXN];
struct edge
{
int to;
edge *next;
}e[MAXN<<1],*prev[MAXN];
void in(int &x)
{
char ch=getchar();x=0;
while (!GET) ch=getchar();
while (GET) x=x*10+ch-'0',ch=getchar();
}
void insert(int u,int v)
{
e[++top].to=v;e[top].next=prev[u];prev[u]=&e[top];
}
void dfs(int x,int fa)
{
f[x]=1;int sum=0;
for (edge *i=prev[x];i;i=i->next)
if (i->to!=fa) dfs(i->to,x),f[x]+=f[i->to],sum+=(!vis[i->to]);
if (sum>=2) f[x]-=2,vis[x]=1;
else f[x]-=(sum==1);
}
int main()
{
in(T);int u,v;
while (T--)
{
in(n);top=0;memset(e,0,sizeof(e));memset(prev,0,sizeof(prev));memset(vis,0,sizeof(vis));
for (int i=1;i<n;i++) in(u),in(v),insert(u,v),insert(v,u);
dfs(1,0);printf("%d\n",f[1]);
}
}