loj #6673. EntropyIncreaser 与山林 题解
题目描述
一句话题意:给定简单图 \(G = (V, E)\),你需要计算出有多少个边的子集 \(E' \subseteq E\),使得由这些边构成的 \(G\) 的生成子图是欧拉图。
\(n\le 20,m\le \frac{n(n-1)}{2}\)
题解
首先我们对点集而不是边集计数,统计 \(f_S\) 表示点集 \(S\) 的导出子图中,能有多少种选边集的方式使得其为欧拉图。
考虑一个图是欧拉图的充要条件,发现当且仅当图联通且每个点的 \(\deg\) 均为偶数。
考虑第一个条件可以用 \(\ln-\exp\) 处理。
现在我们需要 \(\forall S\),统计 \(g_S\) 表示点集 \(S\) 的导出子图中,能有多少种选边集的方式使得所有点 \(\deg\) 均为偶数。
考虑经典生成树:对于点集导出子图的每个联通块,我们注意到生成树是很关键的。
于是任意钦定一颗生成树,此时其他边我们爱咋选咋选,此时一定恰好存在一种生成树上的选择方案使得所有点 \(\deg\) 均为偶数。
具体证明就考虑从叶子到根做一遍 dfs,若是奇数则选父亲边即可。
于是每个 \((n,m)\) 联通块有 \(2^{m-(n-1)}\) 种方案。
于是 \(g_S=2^{E_S-V_S+con_S}\),三个量分别表示边数,点数,联通块数。
然后对于集合幂级数 \(F(x)=\sum\limits_{S}f_Sx^S,G(x)=\sum\limits_{S}g_Sx^S\)。
我们有 \(G(x)=1+F(x)+\dfrac{F(x)^2}{2!}+\dfrac{F(x)^3}{3!}+\cdots =\exp F(x)\),其中乘法表示子集卷积。
于是 \(F=\ln G\),做一下集合幂级数 \(\ln\) 即可。具体参考 cmd 博客最后一章。
复杂度 \(O(n^22^n)\),常数劣的可以学学我代码的写法,感觉很小清新。

浙公网安备 33010602011771号