题意:
给定一棵$n$个节点的无根树,可以对边黑白染色。求对于每个点有多少种染色方案,使得它到任意点的路径上至多经过一条黑边。对$10^9+7$取模。
$1\le n \le 10^5$
分析:
可以看出,这题就是把每个点做根的情况都求一遍。
先来看链的情况:以$i$号点做根,那么左侧的边总共只能有一条染黑;右侧同理。由乘法原理可得答案为$i\times (n-i+1)$。
考虑树形DP。假设确定$1$号点为根节点,设$f_i$表示由下至上$i$点及其子树的答案,那么很容易得到$$f_i=\prod\limits_{j\in son_i} ( f_j+1 )$$
算法是儿子到父亲的这条边染不染黑。染了那么整棵子树都不能再染,不染就是直接传子树答案。兄弟之间对父亲的贡献互不干扰,所以要乘起来。
现在来考虑怎么换根。
发现我们的答案和深度无关,同一棵子树的贡献总是一定的,考虑记忆化。
但是换根之后树的形态发生变化,不能用点代表子树。
发现点不能代表子树的原因是遍历子树的方向会有不同。即:可以用不同的边进入同一点。
那么就可以对边记忆化。完成!
实现:
小结:
没什么好说的。认真水题吧。