CF1689C 题解
思路
这题的舍取我们可以分情况考虑:
- 是叶子结点,删不删无所谓,都是 ;
- 有一个儿子,果断删,保全它的所有子节点,共 个(其中 表示以 为根的子树下的节点个数);
- 有两个儿子,只能舍一个保一个,保左儿子和保右儿子取个 就行。舍的部分继续递归。
代码
# include <bits/stdc++.h>
using namespace std;
int t, n, x, y, s[300005];
vector <int> v[300005];
int sum (int x, int f) {
if (s[x])
return s[x];
s[x] = 1;
for (int i : v[x])
if (i != f)
s[x] += sum (i, x);
return s[x];
}
int fun (int x, int f) {
int l = 0, r = 0;
for (int i : v[x])
if (i != f)
if (l)
r = i;
else
l = i;
if (r)
return max (fun (l, x) + sum (r, x), sum (l, x) + fun (r, x)) - 1;
if (l)
return sum (l, x) - 1;
return 0;
}
int main () {
ios::sync_with_stdio (0);
cin.tie (0);
cout.tie (0);
cin >> t;
while (t --) {
cin >> n;
for (int i = 1; i <= n; ++ i)
v[i].clear (), s[i] = 0;
while (-- n)
cin >> x >> y, v[x].push_back (y), v[y].push_back (x);
cout << fun (1, 0) << '\n';
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下