loading

图计数问题没做

DAG 计数

最经典的一类问题。

问题:给定一张图,求选出若干条边使得图最终是 DAG。

解法:每次转移枚举所有零度点(相当于对于一个图,将所有零度点剥掉,然后剩下的图是一个子问题),然后让零度点与其他点连边。做法的问题在于难以保证零度点只有枚举的这些,所以考虑容斥,钦定零度点点集为 \(S\),剩下的没有保证,这样随便连边即可。那么容斥系数是多少呢?假设正确的零度点点集为 \(S\),那么这个方案会被算 \(\sum_{i=1}^{\lvert S\rvert}\binom{\lvert S\rvert}{i}f(i)\) 次,\(f(i)\) 是一个关于 \(i\) 的容斥系数,取 \(f(i)=(-1)^{i-1}\) 即可。复杂度 \(O(3^n+2^n\operatorname{poly}(n))\),后面的复杂度视具体情况而定,但前面的应该不太会变。

例题:

  • P6846 Amusement Park:需要求的是变向次数之和,发现此时零度点和其他点的连边方案数不太好算(但是精细实现应该还是能做到 \(O(3^n)\),但不优美),注意到求的是变向次数,所以一种方案将全部边反向后是另一种方案,两者总和为 \(m\),所以所有方案变向次数平均值是 \(\frac{m}{2}\),求无向图定向方案后再乘上平均值即可。
  • ABC306H Balance Scale:这题先考虑没有 =,那么大小关系构成一张图,我们要给其定向,矛盾说明存在一个环,那么就相当于 DAG 计数;考虑 =,发现只有在加入零度点时零度点之间的边要选 =,但你发现容斥系数有问题。咋改呢?你发现,还是假设恰好的情况,所有 = 会将零度点连成若干个连通块,注意到如果一个连通块被拆开了,那么这个方案数对当前情况是没贡献的,所以容斥系数实际上变成了 \((-1)^{连通块数-1}\)。
  • P6295 有标号 DAG 计数:还是同理,设 \(f_n\) 表示 \(n\) 个点的 DAG 数量(不保证连通),\(f_n=\sum_{1\le i\le n}f_{n-i}2^{i(n-i)}\binom{n}{i}(-1)^{i-1}\),为了方便多项式优化将 \(i(n-i)\) 拆成 \(\binom{n}{2}-\binom{i}{2}-\binom{n-i}{2}\)(按照完全平方公式拆会导致指数上不为整数,不好处理),变成 \(\dfrac{f_n}{2^{\binom{n}{2}}n!}=\sum_{1\le i\le n}\dfrac{f_{n-i}}{2^{\binom{n-1}{2}}(n-i)!}\cdot\dfrac{(-1)^{i-1}}{2^{\binom{i}{2}}i!}\),设 EGF \(\hat{F}(x)=\sum_{n\ge 0}\dfrac{f_n}{2^{\binom{n}{2}}n!},\hat{G}(x)=\sum_{n\ge 0}\dfrac{(-1)^{n-1}}{2^{\binom{n}{2}}n!}\),注意由于不能从 0 转移所以设 \(g_0=0\),则有 \(\hat{F}=\hat{F}\cdot\hat{G}+1\rightarrow\hat{F}=\dfrac{1}{1-\hat{G}}\),\(+1\) 是因为 \(f_0=1\)。原题要连通,而一般图是连通图的 exp,所以连通图是一般图的 ln,答案即为 \(\ln\hat{F}(x)\)。复杂度 \(O(n\log n)\)。

强连通图计数

嘟嘟嘟。

双连通图计数

咕咕嘎嘎。

训练题目

QOJ6275 大度一点

你需要对一个点集求答案,直接设 \(f_S\) 表示 \(S\) 的答案可能会死的很惨。设 \(f_{i,S}\) 表示 \(S\) 为点集,且点集中编号 \(\le i\) 的点全部二度(\(deg\ge 2\))。初始随便连,转移的时候考虑在 \(f_{i-1,S}\) 的基础上减掉“加上 \(i\) 就不合法”的方案数,只有两种情况:\(deg=0\) 或 \(deg=1\)。\(deg=0\) 的情况直接删掉 \(i\) 点,即减掉 \(f_{i-1,S\backslash\{i\}}\);\(deg=1\) 的话,我们不断删掉编号 \(\le r\) 的叶子,假设删掉的点是 \(u_1,u_2,\cdots,u_k=i\),则最后剩下的图是 \(f_{i-1,S\backslash\{u_1,u_2,\cdots,u_k\}}\) 中的情况,这个东西我们可以设一个辅助数组 \(g_{i,S}\) 表示点集为 \(S\) 当前点为 \(i\) 来做。

说一下细节,注意一下辅助数组初始点是可以有 \(>i\) 的,但是转移过程中不能有 \(>i\) 的点出现,并且初始点不能是 \(i\) 本身。

瓶颈在于辅助数组的转移,复杂度 \(O(2^nn^3)\)。

联合省选 2024 D2T2 重塑时光

先考虑什么样的排列划分是合法的。我们将偏序关系看成边,则首先要求划分的每一段内部是合法的,并且若将整个段缩成一个点则新图也是合法的。对于第一个条件,只需要满足段内部是段内无向图的一个合法的拓扑序即可,对一个点集的拓扑序计数是平凡的;对于第二个条件,只需要满足缩点后的图是一张 DAG 即可。

我们考虑对 DAG 计数,套用 DAG 容斥的经典方式,设 \(f_{S,i}\) 表示选了 \(i\) 个连通块点集为 \(S\) 的答案,\(g_{S,i}\) 表示选了 \(i\) 个连通块点集为 \(S\) 且钦定选的这些块是零度点的答案,拓扑序的方案数被算在里面了。\(g\) 的转移枚举下一个段的点集是多少即可,\(f\) 的转移枚举零度点的点集和连通块个数即可,别忘了带上容斥系数。注意由于零度点之间不钦定顺序,而你的 \(g\) dp 方案多半会带顺序,所以可能要除掉一个阶乘。

直接转移瓶颈在 \(f\) 的转移,为 \(O(3^nn^2)\),剪枝足够优秀足以通过,若要继续优化可以发现 \(f\) 转移时枚举连通块个数那一部分是个卷积,拉插优化即可,具体来说就是把 \(f_{S,i}\) 看成 \(x^i\) 的系数,然后把这个“多项式”变成点值形式,这样卷积复杂度降为 \(O(n)\),然后再用拉插把原来的系数插出来,复杂度降为了 \(O(3^nn)\)。

posted @ 2026-01-28 12:06  dcytrl  阅读(18)  评论(1)    收藏  举报