这是树形 dp 中的换根 dp。
Description
有一个 n n n 个节点的树,对一些节点染色,使得所有被染色的节点是一个连通块。求对于 1 , 2 , . . . , n 1,2,...,n 1,2,...,n 每个节点,该节点被染色的方案个数。所有答案对 M M M 取模。
-
1 ≤ n ≤ 1 0 5 1\le n\le 10^5 1≤n≤105
-
2 ≤ M ≤ 1 0 9 2\le M\le 10^9 2≤M≤109
Solution
换根 dp,我们需要考虑两个 dp 状态:
-
d p 1 u dp1_u dp1u 表示考虑以 u u u 为根节点的子树,染色节点 u u u 被染色的方案数。
-
d p 2 u dp2_u dp2u 表示考虑以 u u u 为根节点的子树外的节点和 u u u,节点 u u u 被染色的方案数。
转移:
对于换根 dp ,我们要用两次 dfs 转移 dp 值。
第一次 dfs 选取节点 0 为根,在这棵有根树上转移 d p 1 dp1 dp1 的值。
d p 1 u = ∏ ( d p 1 v + 1 ) dp1_u=\prod (dp1_v+1) dp1u