题解:P4547 [THUWC 2017] 随机二分图

news/2025/3/6 20:14:16/文章来源:https://www.cnblogs.com/fugipig/p/18756327

link

发现期望的完美匹配数量也就相当于每个完美匹配出现的概率之和,因而我们只需要求每个完美匹配的概率即可。

考虑只有 \(0\) 类边的情况,我们可以设 \(f_{i,T}\) 表示左部的前 \(i\) 个点匹配完后,右部点中被匹配的集合是 \(T\) 的概率,然后进行转移即可。

接下来考虑有 \(1\) 类边的情况,由于需要同时加入两条边,我们将状态改为 \(f_{S,T}\) 表示左部匹配了 \(S\) 中的点,右部匹配了 \(T\) 中的点的概率,注意有 \(|S|=|T|\)。我们依然可以将每条边按 \(\frac12\) 的概率加入,发现此时两条边都选的概率是 \(\frac14\),而事实上是 \(\frac12\), 因而我们只需加入一个包含两条边且概率为 \(\frac14\) 的组即可将概率补齐。

类似的,对于二类边,两条边都选的概率是 \(\frac14\),而事实上是 \(0\), 因而我们只需加入一个包含两条边且概率为 \(-\frac14\) 的组即可将概率补齐。

为了避免重复,我们每次都要类似只有 \(0\) 类边时选编号最小的左部未匹配点来匹配。

由于 \(|S|=|T|\),状态数为 \(\sum_{i=0}^n\binom{n}{i}^2=\binom {2n}n\approx1.5⋅10^8\),时间复杂度即 \(O(\binom {2n}nn^2)\) 使用记忆化搜索可以通过。

参考资料:LOJ2290 「THUWC 2017」随机二分图

Code:

#include<iostream>
#include<map>
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define per(i,l,r) for(int i=(l);i>=(r);i--)
using namespace std;
const int maxm=1000,mod=1e9+7;
typedef long long ll;
inline ll qpow(ll a,int b){ll res=1;while(b){if(b&1)res=res*a%mod;a=a*a%mod;b>>=1;}return res;
}
int a1[maxm],ab[maxm],ms,in,im,iv2,iv4,tot;
map<int,int> mp;
inline ll dfs(int s){//这里将 S 和 T 一起存储到 s 里if(s==ms)return 1;if(mp.count(s))return mp[s];ll res=0,p=0;rep(v1,0,in-1)if(!(s&(1<<v1))){p=1<<v1;break;}rep(v1,1,tot)if(!(s&a1[v1])&&(a1[v1]&p)){res=(res+ab[v1]*dfs(s|a1[v1]))%mod;}return mp[s]=res;
}
int main(){cin>>in>>im;iv2=qpow(2,mod-2);iv4=qpow(4,mod-2);ms=(1<<in*2)-1;rep(v1,1,im){int iop,ix,iy;scanf("%d %d %d",&iop,&ix,&iy);int s=(1<<ix-1)|(1<<iy+in-1);a1[++tot]=s;ab[tot]=iv2;if(iop){scanf("%d %d",&ix,&iy);a1[++tot]=(1<<ix-1)|(1<<iy+in-1);ab[tot]=iv2;if(s&((1<<ix-1)|(1<<iy+in-1)))continue;a1[++tot]=s|(1<<ix-1)|(1<<iy+in-1);ab[tot]=(iop==1?iv4:mod-iv4);}}cout<<dfs(0)*qpow(2,in)%mod<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/894788.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS Next 属性动画和转场动画

HarmonyOS Next 属性动画和转场动画 在鸿蒙应用开发中,动画是提升用户体验的关键要素。通过巧妙运用动画,我们能让应用界面更加生动、交互更加流畅,从而吸引用户的注意力并增强其使用粘性。鸿蒙系统为开发者提供了丰富且强大的动画开发能力,其中属性动画是整个动画体系的核…

C语言小记

int a =10; int b=3; int c= pow(10,3); //表示10的三次方unsigned 表示不用补码表示 //数字的输入,%d 包括 char,short,int%u unsigned%ld long long%lu unsigned long long输入 float 是 %f double 是 %lf shuchu dou shi %f保留小数的话是大于5才入,小于等于5舍去强…

系统流程图联系

练习题一:图书馆借阅管理系统流程图绘制 背景说明:在学校图书馆借阅管理系统中,学生借阅图书需要经过一系列流程。首先,学生携带校园卡前往借阅处,工作人员通过刷卡设备读取学生信息,系统验证学生身份是否有效。若身份无效,系统提示原因(如校园卡过期、欠费等)。若身份…

推荐4本专著《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》书,非常感谢

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…

SAS 9.4软件下载与安装教程

1、安装包 扫描下方二维码关注「软知社」,后台回复【043】三位数字即可免费获取分享链接,无广告拒绝套路;2、安装教程双击setup.exe安装,弹窗安装对话框简体中文,点击确定默认选择,点击下一步指定SAS安装主目录,选择C盘之外磁盘,点击下一步选择第二个,安装SAS Foundat…

MyBatis与其使用方法讲解

ORM在讲解Mybatis之前,我们需了解一个概念ORM(Object-Relational Mapping)对象关系映射,其是数据库与Java对象进行映射的一个技术.通过使用ORM,我们可以不用编写负责的Sql语句,而是通过操作对象来实现增删改查操作缺优分析优点提高开发效率,减少代码的重复性和维护成本 增加代码…