我等必将复起,古木已发新枝。
前置是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)
7
评论
2024-03-23 22:42:12
|