Loading

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)\),常数劣的可以学学我代码的写法,感觉很小清新。

\(\text{record}\)

posted @ 2025-02-26 10:12  HaHeHyt  阅读(113)  评论(0)    收藏  举报