P1232 [NOI2013] 树的计数

发布时间 2023-11-01 08:56:54作者: 御坂夏铃

首先要明确,对于一个结点,其儿子的遍历顺序是确定的,在 DFS 序和 BFS 序中相同。

而 BFS 序更容易确定一棵树的深度,只需要知道在哪些结点分了层。

所以可以通过 DFS 序来确定 BFS 中的分层方案。

然后分类讨论:

  • \(BFS_u+1=BFS_v\)\(DFS_u>DFS_v\),相差恰好一层。若同层则说明 DFS 先进入了 \(v\) 所在的子树,BFS 必然也先遍历到 \(v\) 点,不合法,所以必定分层,平均贡献为 \(1\)
  • \(BFS_u+1=BFS_v\)\(DFS_u<DFS_v\),此时存在两种情况均可以发生
    • \(u\) 没有儿子,\(v\)\(u\) 的兄弟。
    • \(u\)\(v\) 的父亲,\(u\) 是它所在层最后遍历到的结点,\(v\) 是它所在层最先遍历到的结点。换句话说就是 \(u\) 所在层的其它结点都没有儿子了。

这两种情况 BFS 序中之后结点分布条件完全相同,即对后面无影响,可选任意一种,平均贡献为 \(0.5\)

刚刚我们对 BFS 中相邻的结点进行了是否分层的讨论,而 DFS 序的约束其实我们没有考虑完全:

  • \(DFS_u+1=DFS_v\)\(BFS_u>BFS_v\)\(u\)\(y\) 前面一个兄弟的子树内最后一个 DFS 到的结点,此时 \(v\) 的深度只要比 \(u\) 浅即可。但我们并不需要去进行限制,因为按 BFS 序正常做中间肯定有地方会分层。
  • \(DFS_u+1=DFS_v\)\(BFS_u<BFS_v\)\(BFS\) 序中在 \(u\)\(v\) 中间的结点肯定是前一部分与 \(u\) 深度相同,后一部分与 \(v\) 深度相同。如果 \(BFS_u+1<BFS_v\),和上面同理,肯定有恰好一个地方会强制产生分层(否则就不合法了),而剩下那些可分可不分的就一定不能分,这里需要进行一个限制,用差分实现。

相邻结点的讨论已经足够完备了。