题目链接:https://codeforces.com/contest/1566/problem/E
分析
对于一棵树,我们可以将所有的bud都分离开来,分成许多最大深度为2的块:
然后可以将其尽量往一条链上连:
可以发现如果一个bud点有
x
x
x个叶结点,那么其对答案的贡献为
x
−
1
x-1
x−1。
递归即可,具体看代码
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define fi first
#define se second
#define pb push_back
#define MP make_pair
const int inf = 1e9 + 10;
const int N = 2e5 + 10;
int n,ans;
vector<int> g[N];
int dfs(int u, int fa)
{
int sum = 0;
for(int i=0;i<g[u].size();i++)
{
int v = g[u][i];
if(v == fa) continue;
sum += dfs(v, u);
}
if(sum == 0) return 1;
else
{
ans += sum - 1;
return 0;
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ans = 1;
scanf("%d",&n);
for(int i=1;i<=n;i++) g[i].clear();
for(int i=1;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
g[u].pb(v);
g[v].pb(u);
}
dfs(1, 0);
printf("%d\n",ans);
}
return 0;
}