[SHOI2015]聚变反应炉[树dp、贪心]

题意

给定一棵 \(n\) 个点的树,每个点有一个启动能量 \(d\) 和传递能量 \(c\) ,如果一个点被启动了,就会向和他直接相连的点发送 \(c\) 的能量,初始所有节点能量为0,问最少多少能量才能启动所有节点。

分析

  • 定义状态 \(f_i\) 表示先激活父亲再激活 \(i\)\(g_i\) 表示先激活 \(i\) 再激活父亲。
  • 对于前50分,容易发现对于每个 \(i\) 来说, \(f\)\(g\) 的差值最多为1,因为 \(f\) 除了父亲的贡献,子树内的选择可以复制 \(g\)
    • 如果 \(f_i = g_i\) (父亲一定不传能量),那么一定选择 \(g\) ,这样还 \(i\) 还可以向父亲贡献;
    • 如果 \(g_i-f_i=1\) (父亲一定传能量),一定选择 \(f\) ,这样 \(i\) 和父亲之间稳定传输了1能量,反过来不一定。
  • 对于后50分,考虑对于所有 \(i\) 的子节点进行一个dp,定义 \(h_i\) 表示一共收到了来自儿子的 \(i\) 点能量的最小花费。复杂度 \(O(n^2)​\)

代码

代码链接

posted @ 2019-02-16 09:11  fwat  阅读(351)  评论(0编辑  收藏  举报