sicily 1140 国王的遗产

dfs

题意:
给你一颗n个节点的树,操作k次.每次要剪掉一条边产生两棵树,然后删去其中一棵树.
要求删去的树的节点数最大但不超过当前节点数的一半,如果有不止一条边被剪后,使得删去的树一样大,那么选择树的所有节点编号字典序更小的来删

数据范围:
n<=30000,k<=100

思路:

这个数据范围下勉强水过.

每次操作随便找一个根,然后dfs,类似树形dp,记录下某个节点作为子树的根的总节点数dp[ison].然后对于连接父亲和儿子的一条边(每次操作某个点的父亲都可能不同,因为这原本是无根树,根是随便找的),儿子那边的树的节点数就是儿子记录的dp[ison],相对父亲的就是当前的点数nv-dp[ison].我们需要在这些值中找出最接近nv/2的值对应的边,把它们当成是候选边

假如候选边有多条,那么就要考虑那棵对应的树的所有节点编号,但其实只需考虑编号最小的点即可,字典序是骗人的.也就是,现在要证明,假如边ea,eb都是候选边,那么它们对应的树的最小编号节点不会相同.

假如边ea把原来的树给等分成m1和m2,那么ea就是连接m1和m2的唯一的边.这样假设存在eb是候选边,它必定在m1里或者m2里,不妨设它在m1里这样的话eb把树分成了m3,m4+m2两块,其中m3+m4=m1,eb是连接m3,m4的唯一的边.由于m3和m4+m2的节点数不可能相等,所以eb不可能是候选边


假如边ea把原来的树不等分地分成m1和m2,并且节点数比较m1>m2,那么m2的节点数就是最大的节点数.现在考虑候选边eb,假如它在m2里,那么它分出m1+m3和m4,其中m3+m4=m2,此时m1+m3节点数超过总节点数的一半,而m4<m2,故eb不可能是候选边;假如eb在m1里,分出m3,m4+m2,其中m3+m4=m1,此时只可能是m3的节点数达到了最大值.这样的话,选ea要删m2,选eb要删m3,而m2和m3是没有交集的,因此它们不可能有相同的最小编号的点.证毕

证到这个东西之后就好办了,枚举所有的候选边,暴力dfs或者bfs找它对应的树的最小编号的节点.然后选节点编号最小的候选边,把对应的树的所有节点都删了,这样一次操作就完成了

总结:每次操作dfs记录子树点数,找出最接近上限的候选边,每个边找对应树的最小编号节点,把其中最小的编号的树删除


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值