Gravatar
op_组撒头屯
积分:2982
提交:327 / 662

我等必将复起,古木已发新枝。


前置是Pro3575。

首先把二分图判掉。

回顾一下我们的连边方式可以发现,图中的边只有三类:

1. $(x-1,y-1) \to (x,y)$.

2. $(x-1,y+1) \to (x,y)$.

3. $(x,x+1) \to (x,x+1)$.

显然,每层的方案数互不影响,于是我们可以逐层计算,最后乘在一起即可。


根据有关链头的分析,我们不难得到一个DP:

令 $f_{i,j}$ 表示考虑前 $i$ 个点,且第 $i$ 个点向右留了 $j$ 个链头的方案数。

考虑从 $f_{i-1,k}$ 转移到 $f_{i,j}$。那么 $i$ 中的 $j$ 个点继承前面的链头,剩下 $cnt_i-j$ 个点去连 $fa_i$,那么有

$$f_{i,j} \gets f_{i-1,k} C_{cnt_i}^{j} (2^{cnt_{fa_i}}-1)^{cnt_i-j} g(cnt_{i-1},k,cnt_i,j)$$

其中 $g(n,x,m,y)$ 表示在数量分别为 $n,m$ 的两组点之间连边,使得第一组的前 $x$ 个点以及第二组的前 $y$ 个点都有连边的方案数。

枚举 $x$ 个点中不合法的个数进行容斥,得到

$$g(n,x,m,y)=\sum_{i=0}^{x}(-1)^i C_{x}^{i} (2^{n-i}-1)^y\ 2^{(n-i)(m-y)}$$

转移是有条件的。当 $i$ 为层左端时,$j=0$。当 $fa_i$ 不存在时,$j=cnt_i$。


最后是统计答案。

若本层的右端不是 $(x,x+1)$,那么贡献就是 $f_{i,0}$。

否则,$f_{i,j}$ 需要乘上其内部连边的方案数。不难发现就是在 $cnt_i$ 个点间任意连边(可以自环),使得前 $j$ 个点都有连边的方案数,记作 $h(cnt_i,j)$。

类似的容斥,得到

$$h(n,x)=\sum_{i=0}^x (-1)^i C_{x}^{i} 2^{\frac{(n-i)(n-i+1)}{2}}$$

最终对答案的贡献就是 $\sum f_{i,j}h(cnt_i,j)$。


然后是节点 1 的保留节目。注意到如果节点 1 有自环,那么这个自环在新图中也是必须有的,而我们会当做有无均可计算,所以答案需要 $/2$。

恰当的预处理可以做到时间复杂度 $O(n^3)$。

实际上还有 $O(n^2)$ 的原神做法,但是我不会。一定是原神等级太低导致的。












题目3576  [USACO21Feb Platinum]图的计数(Counting Graphs)      5      评论
2024-03-23 22:42:12