传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1907
一开始链剖,WA
后来贪心,AC
Code:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;
vector<int>G[maxn];
bool vis[maxn];
int siz[maxn],son[maxn],top[maxn],fa[maxn],dep[maxn],w[maxn],z,f[maxn];
void dfs(int u){
siz[u]=1;
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v!=fa[u]){
fa[v]=u;
dfs(v);
siz[u]+=siz[v];
if(siz[son[u]]<siz[v])son[u]=v;
}
}
}
void build(int u,int tp){
w[u]=++z;top[u]=tp;
if(son[u])build(son[u],tp);
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v!=fa[u]&&v!=son[u])build(v,v);
}
}
void calc(int u){
f[u]=1;
int tot=0;
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v==fa[u])continue;
calc(v);
f[u]+=f[v];
if(!vis[v])tot++;
}if(tot>=2)f[u]-=2,vis[u]=1;
else f[u]-=tot==1;
}
int n,T;
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
z=0;
memset(siz,0,sizeof(siz));
memset(vis,0,sizeof(vis));
memset(son,0,sizeof(son));
memset(top,0,sizeof(top));
memset(fa,0,sizeof(fa));
memset(dep,0,sizeof(dep));
memset(w,0,sizeof(w));
for(int i=1;i<=n;i++)G[i].clear();
for(int i=2;i<=n;i++){
int u,v;scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(1);
build(1,1);
calc(1);
printf("%d\n",f[1]);
}
}