E. Shuffle

题意
给定一颗 nnn 个节点的树 TTT,现在要求恰好执行下面的程序操作一次:
- 从 TTT 中选择一个点,作为 T2T_2T2 的新根节点
- 将这个点从 TTT 中删除,现在 TTT 被分成了一个或一个以上的连通块树
- 对每一个连通块重复上述的操作,并将这个新的点连接到上一个步骤添加到 T2T_2T2 的点
即上述操作是一个递归的过程。
现在要回答经过一次上次的程序后,生成的 T2T_2T2 最多有多少个叶节点
思路
首先我们需要指出结论:除去 T2T_2T2 的根节点,我们能拥有的最大叶子数量就是各个连通块的最大独立集,如果根节点度数为一,我们需要特判并给答案额外加一
这是因为:在我们选择第一个点作为 T2T_2T2 的根节点后,剩下的每一对相邻的点都不可能同时成为叶子,因为它们必定存在一个先后顺序,那么先被选择的那个一定会成为后被选择的那个点的祖先。
那么我们可以得出结论(必要条件):最后的叶子集合一定是一个独立集(点集内部没有边)
假设我们已经有了一个独立集作为最终的目标叶子集合,我们如何保证它们一定是 T2T_2T2 的叶子呢?
我们可以每一步都选择不在 MISMISMIS (maximum independent set) 中的点,让它们连接到 T2T_2T2 上,那么最后一定会只剩下我们的叶子集合,即我们的 MISMISMIS,它们连接到 T2T_2T2 上自然就是叶子了。
那么到了这里,答案很显然就是最大独立集的大小了,最后特判一下根节点的度数
问题是,我们第一步选择的 T2T_2

最低0.47元/天 解锁文章
345

被折叠的 条评论
为什么被折叠?



