【动态规划】树上连通块计数

7.4.5.3.树上连通块计数

7.4.5.3.1.树上连通块计数

\(\sum\limits_{\mathbb{V}}1\)

类似于树上点对贡献。

在连通块中深度最小的点处进行统计。

下面简记“连通块中深度最小的点是点u的连通块”为“以点u为根的连通块”。

\(f_u\):当前已统计的以点u为根的连通块的个数。

转移:在遍历到点u的一个儿子点v时,情况分为删除边(u,v)和不删除边(u,v),\(f_u=f_u*1+f_u*f_v\)

边界:\(f_u=1\)。其他为0。

\(ANS=\sum\limits_uf_u\)

补充:另一种dp设计:\(f_{u,d}\):考虑了以u为根的子树,当前u所在连通块的根的深度为d,……。

7.4.5.3.2.树上连通块贡献

\(\sum\limits_{\mathbb{V}}w(\mathbb{V})\)

类似于《7.4.5.3.1.树上连通块计数》。

所有连通块大小的乘积=在每个连通块内恰好选一个点的方案数。dp多开一维0/1表示当前连通块有/无选关键点。

7.4.5.3.3.树上连通块内点贡献

\(\sum\limits_{\mathbb{V}}\sum\limits_{u\in\mathbb{V}}a_u\)

\(f_u\):当前已统计的以点u为根的连通块的个数。

\(g_u\):当前已统计的以点u为根的连通块内的点的贡献。

转移:在遍历到点u的一个儿子点v时,情况分为删除边(u,v)和不删除边(u,v),

  1. \(g_u=g_u*1+(g_u*f_v+g_v*f_u)\)
  2. \(f_u=f_u*1+f_u*f_v\)

边界:\(f_u=1,g_u=a_u\)。其他为0。

\(ANS=\sum\limits_ug_u\)

7.4.5.3.4.树上连通块内点对贡献

\(\sum\limits_{\mathbb{V}}\sum\limits_{u,v\in\mathbb{V}}(a_u\oplus a_v)\),其中⊕满足对加法的分配律。

异或:拆位,转化为1的个数与0的个数的乘积,即可满足对加法的分配律。

结合《7.4.5.1.树上点对贡献》和《7.4.5.3.3.树上连通块内点贡献》。点对仍在点对的lca处进行统计,借助树上连通块的转移将点对贡献到其所属的所有连通块。

\(f_u\):当前已统计的以点u为根的连通块的个数。

\(g_u\):当前已统计的以点u为根的连通块内的点的贡献。

\(h_u\):当前已统计的以点u为根的连通块内的点对的贡献。

转移:在遍历到点u的一个儿子点v时,情况分为删除边(u,v)和不删除边(u,v),

  1. \(h_u=h_u*1+(h_u*f_v+h_v*f_u+g_u\oplus g_v)\)

    当不删除边(u,v)时,统计到含点u和点v的连通块,情况分为点对都在当前以点u为根的连通块(\(h_u*f_v\))、点对都在以点v为根的连通块(\(h_v*f_u\))和点对分别在当前以点u为根的连通块和以点v为根的连通块(\(g_u\oplus g_v\))。

  2. \(g_u=g_u*1+(g_u*f_v+g_v*f_u)\)

  3. \(f_u=f_u*1+f_u*f_v\)

边界:\(f_u=1,g_u=a_u,h_u=0\)。其他为0。

\(ANS=\sum\limits_uh_u\)

在dp中,(i,j)与(j,i)视为相同,不会重复计算。根据题意(i,j)与(j,i)是否算不同的贡献,判断最终答案是否要乘2。

7.4.5.3.5.树上连通块内点对贡献和合并子树信息模型

\(\sum\limits_{cnt_\mathbb{V}(\mathbb{G})=m+1}\sum\limits_{\mathbb{V}\in\mathbb{G}}\sum\limits_{u,v\in\mathbb{V}}(a_u\oplus a_v)\),其中⊕满足对加法的分配律。

\(f_{u,j}\):在以点u为根的子树内,当前已删除了j条边,已统计的以点u为根的连通块的个数。

\(g_{u,j}\):在以点u为根的子树内,当前已删除了j条边,已统计的以点u为根的连通块内的点的贡献。

\(h_{u,j}\):在以点u为根的子树内,当前已删除了j条边,已统计的所有连通块内的点对的贡献。

\(bf_j,bg_j,bh_j\)\(f_{u,j},g_{u,j},h_{u,j}\)的备份数组。备份后\(f_{u,j},g_{u,j},h_{u,j}\)清零。

转移:在遍历到点u的一个儿子点v时,

  • 删除边(u,v),
    • \(h_{u,j+k+1}←bh_j*f_{v,k}+h_{v,k}*bf_j\)
    • \(g_{u,j+k+1}←bg_j*f_{v,k}\)
    • \(f_{u,j+k+1}←bf_j*f_{v,k}\)
  • 不删除边(u,v),
    • $h_{u,j+k}←bh_j*f_{v,k}+h_{v,k}*bf_j+bg_j\oplus g_{v,k} $。
    • \(g_{u,j+k}←bg_j*f_{v,k}+g_{v,k}*bf_j\)
    • \(f_{u,j+k}←bf_j*f_{v,k}\)

边界:\(f_{u,0}=1,g_{u,0}=a_u,h_{u,0}=0\)。其他为0。

\(ANS=h_{1,m}\)

在dp中,(i,j)与(j,i)视为相同,不会重复计算。根据题意(i,j)与(j,i)是否算不同的贡献,判断最终答案是否要乘2。

posted @ 2025-07-27 18:40  Brilliance_Z  阅读(45)  评论(0)    收藏  举报