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
Source
自己写了一发贪心WA了。。然后去看题解
f[i]表示i为子树的最小路径覆盖就可以搞定了
或者
http://ydcydcy1.blog.163.com/blog/static/216089040201323024529876/
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
struct line
{
int s,t;
int next;
}a[20001];
int head[10001];
int edge;
inline void add(int s,int t)
{
a[edge].next=head[s];
head[s]=edge;
a[edge].s=s;
a[edge].t=t;
}
int fa[10001];
int edg[10001],px[10001];
int f[10001];
int ans;
inline void dfs(int d)
{
int i;
for(i=head[d];i!=0;i=a[i].next)
{
int t=a[i].t;
if(t!=fa[d])
{
fa[t]=d;
dfs(t);
if(f[t]==0)
f[d]++;
else if(f[t]==1)
{
f[d]++;
ans--;
}
else
ans-=2;
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T>0)
{
T--;
int n;
scanf("%d",&n);
if(n==1)
{
printf("1\n");
continue;
}
memset(a,0,sizeof(a));
memset(head,0,sizeof(head));
memset(f,false,sizeof(f));
memset(edg,0,sizeof(edg));
memset(fa,0,sizeof(fa));
edge=0;
int i;
int s,t;
for(i=1;i<=n-1;i++)
{
scanf("%d%d",&s,&t);
edge++;
add(s,t);
edge++;
add(t,s);
edg[s]++;
edg[t]++;
}
ans=n;
dfs(1);
if(f[1]==1)
ans--;
if(f[1]>=2)
ans-=2;
printf("%d\n",ans);
}
return 0;
}