diff --git a/TangDou/Topic/HuanGenDp/SubTree.cpp b/TangDou/Topic/HuanGenDp/SubTree.cpp index dadfb9c..57d1386 100644 --- a/TangDou/Topic/HuanGenDp/SubTree.cpp +++ b/TangDou/Topic/HuanGenDp/SubTree.cpp @@ -17,6 +17,8 @@ int mod; // 对 mod 值取模 int pre[N]; // pre[i]:记录i节点的前缀积对mod取模后的值 int suff[N]; // suff[i]:记录i节点的后缀和对mod取模后的值 +// 先递归再统计,以子填父,用儿子们的贡献更新父亲的值。最底层儿子,也就是叶子的贡献值是1,也就是只把它染成黑色,对于这个叶子的父亲而言, +// 它统计方案时,它认为这个儿子提供的方案数是2,因为儿子也可以不染色,也就是白色。当然,儿子也可以染成黑色,所以它理解为2。 void dfs1(int u, int fa) { f[u] = 1; // 以u为根的子树,不管它是不是有子孙节点,最起码可以把u染成黑色,这样就可以有1种方案 vector son; // 记录u有哪些儿子,方便后的计算。不使用链式前向星直接枚举的原因在于前向星只能正序枚举,