[THUWC2017]随机二分图
题目大意
给一张二分图,有左部点和右部点。
有三种边,第一种是直接从左部点连向右部点,出现概率为50%。
第二种边一组里有两条边,这两条边同时出现或者不出现,概率都是50%。
第三种边一组里有两条边,这两条边只能出现一条,概率都是50%。
求这张图完美匹配数的期望
题解
一条边能够带来贡献的条件不是它出现了,而是它出现在了匹配中。所以我们应当直接计算每条边出现在最大匹配中的概率。
第一种边不用研究。
第二种边每一条条边出现在最大匹配中的概率都是50%。
两条边出现在最大匹配中的概率也是50%。
如果我们直接连两条50%的边的话,两条边同时出现的概率就是25%。
所以我们补一条两组的边,概率为25%。
第三种边同理,两条边出现在最大匹配中的概率是0%。
所以我们补一组-25%的边就好了。
dp的话,拿map记搜一下就好了。
代码
#include<iostream>
#include<cstdio>
#include<map>
#define N 16
using namespace std;
typedef long long ll;
const int mod=1e9+;
map<int,int>mp;
map<int,int>::iterator it;
int lo[<<N],tot,head[N],n,m;
inline int rd(){
int x=;char c=getchar();bool f=;
while(!isdigit(c)){if(c=='-')f=;c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return f?-x:x;
}
inline ll power(ll x,ll y){
ll ans=;
while(y){
if(y&)ans=ans*x%mod;x=x*x%mod;y>>=;
}
return ans;
}
inline void MOD(ll &x){while(x>=mod)x-=mod;}
struct edge{int n,to,l;}e[N*N*];
inline void add(int u,int v){
int loo=lo[u&(-u)];
e[++tot].n=head[loo];e[tot].to=u;head[loo]=tot;e[tot].l=v;
}
int DP(int s){
if(!s)return ;
it=mp.find(s);
if(it!=mp.end())return it->second;
int loo=lo[s&(-s)];ll ans=;
for(int i=head[loo];i;i=e[i].n){
int v=e[i].to;if((v&s)!=v)continue;
ans+=1ll*DP(s^v)*e[i].l%mod;MOD(ans);
}
return mp[s]=ans;
}
int main(){
n=rd();m=rd();int u1,v1,u2,v2,ma=(<<n)-,opt;
ll n2=power(,mod-),n4=power(,mod-);
lo[]=;int cc=;
for(int i=;i<=n;++i)cc<<=,lo[cc]=i;
for(int i=;i<=m;++i){
opt=rd();
if(opt==){
u1=rd();v1=rd();u1--;v1--;
int s1=(<<u1)|(<<v1+n);
add(s1,n2);
}
else if(opt==){
u1=rd()-;v1=rd()-;u2=rd()-;v2=rd()-;
int s1=(<<u1)|(<<v1+n),s2=(<<u2)|(<<v2+n);
add(s1,n2);add(s2,n2);
if(!(s1&s2)){
add(s1|s2,n4);
}
}
else{
u1=rd()-;v1=rd()-;u2=rd()-;v2=rd()-;
int s1=(<<u1)|(<<v1+n),s2=(<<u2)|(<<v2+n);
add(s1,n2);add(s2,n2);
if(!(s1&s2)){
add(s1|s2,mod-n4);
}
}
}
cout<<1ll*DP(ma|(ma<<n))*power(,n)%mod;
return ;
}
[THUWC2017]随机二分图的更多相关文章
- Luogu4547 THUWC2017 随机二分图 概率、状压DP
传送门 考虑如果只有$0$组边要怎么做.因为$N \leq 15$,考虑状压$DP$.设$f_i$表示当前的匹配情况为$i$时的概率($i$中$2^0$到$2^{N-1}$表示左半边的匹配情况,$2^ ...
- BZOJ5006 THUWC2017随机二分图(概率期望+状压dp)
下称0类为单边,1类为互生边,2类为互斥边.对于一种匹配方案,考虑其出现的概率*2n后对答案的贡献,初始为1,如果有互斥边显然变为0,否则每有一对互生边其贡献*2.于是有一个显然的dp,即设f[S1] ...
- THUWC2017随机二分图
题面链接 洛谷 sol 唯一的重点是拆边... 0的不管,只看1.2. 先无论如何把两条边的边权赋为\(0.5\)然后我们发现如果两个都选了. 对于第一种边,我们发现如果\(\frac{1}{2} * ...
- [BZOJ5006][LOJ#2290][THUWC2017]随机二分图(概率+状压DP)
https://loj.ac/problem/2290 题解:https://blog.csdn.net/Vectorxj/article/details/78905660 不是很好理解,对于边(x1 ...
- [LOJ2290] [THUWC2017] 随机二分图
题目链接 LOJ:https://loj.ac/problem/2290 洛谷:https://www.luogu.org/problemnew/show/P4547 Solution 首先考虑只有第 ...
- [思路题][LOJ2290][THUWC2017]随机二分图:状压DP+期望DP
分析 考虑状压DP,令\(f[sta]\)表示已匹配状态是\(sta\)(\(0\)代表已匹配)时完美匹配的期望数量,显然\(f[0]=1\). 一条边出现了不代表它一定在完美匹配内,这也导致很难去直 ...
- P4547 [THUWC2017]随机二分图(状压,期望DP)
期望好题. 发现 \(n\) 非常小,应该要想到状压的. 我们可以先只考虑 0 操作. 最难的还是状态: 我们用 \(S\) 表示左部点有哪些点已经有对应点, \(T\) 表示右部点有哪些点已经有对应 ...
- 题解 洛谷 P4547 【[THUWC2017]随机二分图】
根据题意,题目中所求的即为所有\(n!\)种完美匹配的各自的出现概率之和再乘上\(2^n\)的值. 发现\(n\)很小,考虑状压\(DP\).设\(f_{S,T}\)为左部图匹配情况为\(S\),右部 ...
- 【THUWC2017】随机二分图(动态规划)
[THUWC2017]随机二分图(动态规划) 题面 BZOJ 洛谷 题解 如果每天边的限制都是\(0.5\)的概率出现或者不出现的话,可以把边按照二分图左侧的点的编号排序,然后设\(f[i][S]\) ...
随机推荐
- pip 使用豆瓣源
pip 使用豆瓣源 由于pip 默认使用Python的官方源pypi.python.org/pypi,导致我们经常使用pip装包时速度过慢或者无法安装(请求超时)等问题, 所以国内用户建议使用pip ...
- 【资源分享】ArcFace Demo [Android]
虹软人脸识别引擎Android的Demo演示,可以直接下载使用. 下载地址: https://github.com/asdfqwrasdf/ArcFaceDemo readme: 工程如何使用? 下载 ...
- C++ 重点关键字
const 四种用法 1.修饰变量起到限定只读作用: void func(const int a, const string str) {...} const int* func(...) {...} ...
- python3 set(集合)
add(增加元素) name = set(['Tom','Lucy','Ben']) name.add('Juny') print(name) #输出:{'Lucy', 'Juny', 'Ben', ...
- Think_in_java_4th(并发学习二)
使用Executor java.util.concurrent CachedThreadPool package concurrency.ExecutorService; //: concurrenc ...
- C# -- 结构、访问修饰符
C# -- 结构.访问修饰符 1. 结构: struct 类型 对于结构,不像类那样存在继承. 一个结构不能从另一个结构或类继承,而且不能作为一个类的基. 但是,结构从基类 Object 继承. 结构 ...
- 推荐六款炫酷的HTML5效果插件
1. HTML5 3D图片阴影翻转动画 效果很酷 分享一款很酷的HTML5 3D动画特效,这款3D特效可以为你的图片增加阴影的效果,而且可以让图片在鼠标滑过的时候出现3D翻转的动画效果.这和HTML5 ...
- (笔记)CTF入门指南
[考项分类] Web: 网页安全 Crypto: 密码学(凯撒密码等) PWN: 对程序逻辑分析 系统漏洞利用 Misc: 杂项 图片隐写 数据还原 脑洞类 信息安全有关的 Reverse: 逆向工程 ...
- Django【跨域】
jsonp 方式一:指定返回方法 # 后端 def view(request): callback = request.GET.get('callback') return HttpResponse( ...
- Docker(1):CentOS7 安装Docker
1.查看系统内核,docker要求系统的内核版本高于3.10 # uname -r 2.升级yum包,确保最新 # yum update 3.安装所需要依赖包 # yum install - ...