loj #6673. EntropyIncreaser 与山林 题解

题目描述#

一句话题意:给定简单图 G=(V,E),你需要计算出有多少个边的子集 EE,使得由这些边构成的 G 的生成子图是欧拉图

n20,mn(n1)2

题解#

首先我们对点集而不是边集计数,统计 fS 表示点集 S导出子图中,能有多少种选边集的方式使得其为欧拉图。

考虑一个图是欧拉图的充要条件,发现当且仅当图联通且每个点的 deg 均为偶数。

考虑第一个条件可以用 lnexp 处理。

现在我们需要 S,统计 gS 表示点集 S导出子图中,能有多少种选边集的方式使得所有点 deg 均为偶数。


考虑经典生成树:对于点集导出子图的每个联通块,我们注意到生成树是很关键的。

于是任意钦定一颗生成树,此时其他边我们爱咋选咋选,此时一定恰好存在一种生成树上的选择方案使得所有点 deg 均为偶数。

具体证明就考虑从叶子到根做一遍 dfs,若是奇数则选父亲边即可。

于是每个 (n,m) 联通块有 2m(n1) 种方案。

于是 gS=2ESVS+conS,三个量分别表示边数,点数,联通块数。


然后对于集合幂级数 F(x)=SfSxS,G(x)=SgSxS

我们有 G(x)=1+F(x)+F(x)22!+F(x)33!+=expF(x),其中乘法表示子集卷积

于是 F=lnG,做一下集合幂级数 ln 即可。具体参考 cmd 博客最后一章

复杂度 O(n22n),常数劣的可以学学我代码的写法,感觉很小清新。

record

posted @   HaHeHyt  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
主题色彩
主题色彩