CF1097G 题解

批评一下很多题解,感觉大部分都没搞懂自己在写什么。

然后这个 dp 设计确实很妙。(也许是我孤陋寡闻了)

题意

给你一棵有 \(n\) 个节点的树 \(T\)\(n\) 个节点编号为 \(1\)\(n\)

对于 \(T\) 中每个非空的顶点的集合 \(X\),令 \(f(X)\) 为包含 \(X\) 中每个节点的最小连通子树的最小边数。

再给你一个整数 \(k\)。你需要计算对于每一个顶点的集合 \(X\)\((f(X))^k\) 之和,即:

\[\sum_{X\subseteq\{1,2,\dots,n\},X\neq\varnothing}(f(X))^k \]

\(2\leq n\leq 10^5,1\leq k\leq 200\)

题解

首先可以用斯特林数转成选 \(k\) 条边方案数的总和。

然后考虑一个 dp,\(f_{u,i}\) 表示以 \(u\) 为根的子树,对于每个非空点集,选择 \(i\) 条边的方案数之和。

但这个 dp 不了,原因是我们无法考虑实际上生成树的根到 \(u\) 上的边,而在合并中这显然是重要的。

于是我们改状态,\(f_{u,i}\) 表示以 \(u\) 为根的子树,对于每个非空点集,在生成树中的边和生成树的根到 \(u\) 上的边中,选择 \(i\) 条边的方案数之和。

这个就可以 dp。

于是就可以分讨了:

  • 初始时 \(f_{u,0}=1\)(因为保证选点子集非空。)
  • 只包含新子树,不选 \(u\)\(f^{\prime}_{u,i}\leftarrow f^{\prime}_{u,i}+f_{v,i}+f_{v,i-1}\)
  • 原子树和新子树合并:\(f^{\prime}_{u,i+j(+1)}\leftarrow f^{\prime}_{u,i+j}+f_{u,i}f_{v,j}\)

似乎没有考虑包含新子树和 \(u\) 的情况,但其实我们初始时的 \(dp_{u,0}\) 已经包含了。

哪里统计答案?我们发现是在原子树和新子树合并时才能得到一棵合法的树(或者是只选一个点也可以,但是只有 \(k=0\) 时才需要考虑)。

然后做完了吧,感觉比较妙的是把选或不选 \(u\) 的决策融进了转移中。

posted @ 2026-03-22 14:12  ThisIsLu  阅读(4)  评论(0)    收藏  举报