背景
题意
对于多组数据,每次以节点、儿子个数及其儿子集合的形式给出一棵 (n) 个点的无根树(点从 (0) 标号至 (n-1) ),规定一个节点可以覆盖距离它不超过 (1) 的所有节点,求全图能被覆盖住要使用的最少点数。
解法
又是树形(dp)模板。
自然地,设 (f_{x,0/1}) 表示 (x) 节点不使用和使用时覆盖以 (x) 为根的子树的最小代价。
问题来了,给定的树没根,咋办?(话说这个傻逼问题足足困扰了我二十分钟。。。。。。)
只要随便选个根就是有根树啦!
为了方便,不妨设 (1) 号节点为根,则直接从 (1) 号点开始 (dfs) 出所有点的父亲即可。
现在回到转移上来。设边集为 (E) ,自然地,有 (f_{x,0}=sum_limits{(x,y) in E} f_{y,1},f_{x_1}=sum_limits{(x,y) in E} min { f_{y,0},f_{y,1} }+1) 。那么要求的就是 (min {f_{1,0},f_{1,1} }) 。
细节
(1.) 由于给定的点是 ([0,n-1]) 内的,考虑读入的时候统一 (+1) 移至正整数区间内再做。
(2.) 多组数据记得清空,且信仰边数不会太多,别开太大容易超时。