0%

CF-1073-F. Prufer Vertex(对于零散的图,计数可以从联通块角度考虑)(使用概率来计数)

题目大意

题目总结:F. Prufer Vertex

1. Prufer 顶点 P(T)P(T) 的定义

对于一棵拥有 n2n \ge 2 个节点的树 TT,按照以下标准过程生成 Prufer 序列:

  • 重复寻找当前树中编号最小的叶子节点并将其删除。

  • 直到树中只剩下最后 2 个节点。
    已知节点 nn 必然是最后剩下的两个节点之一,设另一个剩下的节点为 vv,则定义该树的 Prufer 顶点 P(T)=vP(T) = v

2. 问题描述

给定一个含有 nn 个顶点和 mm 条边的森林。假设该森林有 kk 个连通块,其大小分别为 s1,s2,,sks_1, s_2, \dots, s_k

已知将该森林添加 k1k-1 条边使其成为一棵树的方案总数为:

nk2i=1ksin^{k-2} \prod_{i=1}^{k} s_i

任务: 对于每一个 vv (1v<n1 \le v < n),计算在所有可能的加边成树方案中,满足 P(T)=vP(T) = v 的方案数量。

3. 输出要求

输出 n1n-1 个整数,第 ii 个整数表示满足 P(T)=iP(T) = i 的方案数,结果对 998244353998244353 取模。


样例解释(以样例 1 为例):

输入 n=3,m=0n=3, m=0,森林由三个孤立点 {1,2,3}\{1, 2, 3\} 组成。补全为树的方案共有 332(111)=33^{3-2} \cdot (1 \cdot 1 \cdot 1) = 3 种:

  1. 添加边 (1,2) 和 (1,3): 叶子节点为 2 和 3。最小叶子 2 被删除,剩余 {1,3}\{1, 3\}。故 P(T)=1P(T)=1

  2. 添加边 (2,1) 和 (2,3): 叶子节点为 1 和 3。最小叶子 1 被删除,剩余 {2,3}\{2, 3\}。故 P(T)=2P(T)=2

  3. 添加边 (3,1) 和 (3,2): 叶子节点为 1 和 2。最小叶子 1 被删除,此时 2 变为叶子,删除 2,剩余 {3}\{3\} 与另一节点(在此情况下 Prufer 过程最后剩下的非 nn 节点为 2)。

最终输出:1 2(代表 P(T)=1P(T)=1 有 1 种,P(T)=2P(T)=2 有 2 种)。

思路讲解

我们阐述一下题意,叶子在无根树树中应该就是指的是度为 1 的点(虽然给的是森林,不过我们最后都会连成树),样例 1 的答案生成过程如图所示:

image

我们发现,只要一个点,是只和最大点相连的点(最大点和该点连接且仅和该点连接),那么这个点一定可以被保下来。因为这个点,是最后成为这个叶子节点的。原因:反证法,如果比较早把这个点删除了,那么最大点就变为孤零零一个人了,这显然是不可能的。

那么更进一步的推论就是,答案一定是和最大点直接相连的点。不过,虽然我们知道了答案是和最大点直接相连的点,但是我们不太清楚,到底是哪个点。

我们进行一个猜测,就是以这个点为根的子树,其内部的最大点,是所有的子树中最大的(即其他子树中的最大点,都比这颗子树小)。这样子,在删除这个内部最大点之前,我们会把其他子树全部删除,最后就只剩一颗子树了,结果就确定了。

当然,这个所谓的内部最大点,就是次大值 n1n-1 啦, nn 为根,n1n-1 所在的子树的根就是所能留下来的点

不过现在的难点就来到了这个统计答案。

n1n-1 的特殊情况看起,我们发现,如果 n1n-1 已经连接在了 nn 的联通块上,且 n1n-1nn 之间未直接相连,此时答案为 0。如果直接相连,那么其实其他连通块要连接到 nn 的连通块上,这个要怎么算呢?我们不妨参考一下题目中的这个式子。

给定一个含有 nn 个顶点和 mm 条边的森林。假设该森林有 kk 个连通块,其大小分别为 s1,s2,,sks_1, s_2, \dots, s_k。已知将该森林添加 k1k-1 条边使其成为一棵树的方案总数为:

nk2i=1ksin^{k-2} \prod_{i=1}^{k} s_i

实际上这个式子是凯莱公式的推论?

我们先来看一下凯莱公式吧,凯莱公式即:

image

其证明方法有:

image

呃😅,那我们还是用这个 prufer 序列吧,其实 prufer 序列就是把题目中描述的删点过程:每次我们记录一下这个我们删的点的父节点,得到的就是长度为 n2n-2 的 prufer 序列。这个序列有 nn2n^{n-2} 种选择,由于每颗生成树对应的 prufer 序列显然是唯一的,prufer 序列也唯一对应一颗生成树,因此生成树的数量就是 nn2n^{n-2}(这个说的比较粗糙,只是引入一下 prufer 序列这个工具,帮助后面我们的这个理解)。

那么这个连通块的式子是怎么来的?

首先从 prufer 序列的角度来看,那么由于其中的每个点,都可以作为长度为 k2k-2 的 prufer 序列中的点,所以就是 nk2n^{k-2},那么由于每个连通块还需选出来一个代表点连接,因此是:

nk2i=1ksin^{k-2} \prod_{i=1}^{k} s_i

可以想象,nk2n^{k-2} 代表了这个接收端,i=1ksi\prod_{i=1}^{k} s_i 代表了这个发送端。不过还有一个特例,就是没有被 prufer 序列覆盖的根连通块的这个贡献也包含在了这个 i=1ksi\prod_{i=1}^{k} s_i 当中。换句话说,一个长度为 k2k-2 的 prufer 序列的贡献是 i=1ksi\prod_{i=1}^{k} s_i**,原因在于你要确定所有非根连通块的发送端****(**这个是固定的,只有一个的,否则会成环),还要确定根连通块的接收端(在 prufer 中未体现)(严格来讲是最后一个被删除的块所连接的这个根连通块的接收点)。

哎,我们回来看题目:

我们之前所说的结论:

nn 为根,n1n-1 所在的子树的根就是所能留下来的点

说明,n1n-1 连接在 ii 的子树下,是必要条件,是必须满足的。

你就抓住这个,进行分类讨论即可,因为太过细节,这里就不展开了。

然后,你会发现答案不对

1
2
3
4
_______________[ Sample Testcase #1 OUTPUT]_______________
1 2
0 0 0 1
10 0 1 5 5

这道题目的难点,特别是计数难点在于,如何去解决一些先 kk 连通块连上 ii 的子树,然后 n1n-1 再连上 kk 连通块去的这个情况(或者更加复杂情况下的计数)。

具体而言,我们以样例 3 的这个第一个计数为例:

image

但是这个计数问题我们怎么解决?

我们用算概率的方式,得到这个答案,具体而言:

image

为什么我们可以使用算概率的方式呢?实际上,n1n-1 连接到 11 的子树的概率就是 12\frac{1}{2},无论他是通过 33 连接,还是不通过 33 连接,都是这个概率。这个概率就起到了相当于抽丝剥茧,剥开重重迷雾的作用

AC代码

AC

https://codeforces.com/contest/2191/submission/360174534

心路历程(WA,TLE,MLE……)

  • n1n-1 的答案是:

    • 如果 nnn1n-1 直接相连,答案就是 nk2i=1ksin^{k-2} \prod_{i=1}^{k} s_i。如果不直接相连,还处于同一联通块,那么答案是 0。那么最后一种更普遍的情况,就是 nnn1n-1 处于两个连通块,这个时候就将 nnn1n-1 连接在一起,形成的新的森林,用上面那个公式计算即可。
  • 更加普遍的情况下,ii 的答案是:

    • iinn 处于相同连通块:
    • iinn 处于不同连通块:
      我们之前所说的结论:

nn 为根,n1n-1 所在的子树的根就是所能留下来的点
说明,n1n-1 连接在 ii 的子树下,是必要条件,是必须满足的。