ABC333D 题解

第一次打 atcoder - ABC 的比赛。at 题是真的不错。

如果运气好的话,这篇题解可能也是我第一篇过审的题解。

Solution

题目来源:ABC333D (访问洛谷 | 访问 atcoder)。

题意:

给你一棵有 \(n\) 个结点的无根树,你可以花费 \(1\) 的代价,删除一个叶子结点和其所连边(叶子结点指所连边数为 \(1\) 的结点)。求删除 \(1\) 号结点所需要的最小代价。\(n \le3\times10^5\)


显然我们要删去结点 \(1\),首先得让结点 \(1\) 是叶子结点。而叶子结点的定义是「所连边数为 \(1\) 的结点」,也就是说,我们要让结点 \(1\) 的所连边数为 \(1\)

不妨将结点 \(1\) 看作根结点,这样,我们要通过删除操作,让根结点只剩下一颗子树,这个时候就可以把结点 \(1\) 删去了。保留哪颗子树呢?若我们要让删除的子树结点数最小,那么需要让保留的子树结点最大。

那么我们只需从结点 \(1\) 开始 dfs 求出以 \(1\) 为根的、以 \(i\) 为父结点的子树结点数 \(val_i\),删除的结点数就是结点 \(1\) 所有子树结点数之和减去结点 \(1\) 的最大子树结点数。于是就做完了。记得把结点 \(1\) 也删去,答案加上 \(1\)

Code

posted @ 2024-04-22 14:04  White_Way  阅读(43)  评论(0)    收藏  举报