题目大意

给一张二分图,有左部点和右部点。

有三种边,第一种是直接从左部点连向右部点,出现概率为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]随机二分图的更多相关文章

  1. Luogu4547 THUWC2017 随机二分图 概率、状压DP

    传送门 考虑如果只有$0$组边要怎么做.因为$N \leq 15$,考虑状压$DP$.设$f_i$表示当前的匹配情况为$i$时的概率($i$中$2^0$到$2^{N-1}$表示左半边的匹配情况,$2^ ...

  2. BZOJ5006 THUWC2017随机二分图(概率期望+状压dp)

    下称0类为单边,1类为互生边,2类为互斥边.对于一种匹配方案,考虑其出现的概率*2n后对答案的贡献,初始为1,如果有互斥边显然变为0,否则每有一对互生边其贡献*2.于是有一个显然的dp,即设f[S1] ...

  3. THUWC2017随机二分图

    题面链接 洛谷 sol 唯一的重点是拆边... 0的不管,只看1.2. 先无论如何把两条边的边权赋为\(0.5\)然后我们发现如果两个都选了. 对于第一种边,我们发现如果\(\frac{1}{2} * ...

  4. [BZOJ5006][LOJ#2290][THUWC2017]随机二分图(概率+状压DP)

    https://loj.ac/problem/2290 题解:https://blog.csdn.net/Vectorxj/article/details/78905660 不是很好理解,对于边(x1 ...

  5. [LOJ2290] [THUWC2017] 随机二分图

    题目链接 LOJ:https://loj.ac/problem/2290 洛谷:https://www.luogu.org/problemnew/show/P4547 Solution 首先考虑只有第 ...

  6. [思路题][LOJ2290][THUWC2017]随机二分图:状压DP+期望DP

    分析 考虑状压DP,令\(f[sta]\)表示已匹配状态是\(sta\)(\(0\)代表已匹配)时完美匹配的期望数量,显然\(f[0]=1\). 一条边出现了不代表它一定在完美匹配内,这也导致很难去直 ...

  7. P4547 [THUWC2017]随机二分图(状压,期望DP)

    期望好题. 发现 \(n\) 非常小,应该要想到状压的. 我们可以先只考虑 0 操作. 最难的还是状态: 我们用 \(S\) 表示左部点有哪些点已经有对应点, \(T\) 表示右部点有哪些点已经有对应 ...

  8. 题解 洛谷 P4547 【[THUWC2017]随机二分图】

    根据题意,题目中所求的即为所有\(n!\)种完美匹配的各自的出现概率之和再乘上\(2^n\)的值. 发现\(n\)很小,考虑状压\(DP\).设\(f_{S,T}\)为左部图匹配情况为\(S\),右部 ...

  9. 【THUWC2017】随机二分图(动态规划)

    [THUWC2017]随机二分图(动态规划) 题面 BZOJ 洛谷 题解 如果每天边的限制都是\(0.5\)的概率出现或者不出现的话,可以把边按照二分图左侧的点的编号排序,然后设\(f[i][S]\) ...

随机推荐

  1. (最完美)小米平板3的USB调试模式在哪里开启的流程

    经常我们使用安卓手机链上电脑的时候,或者使用的有些应用软件比如我们公司营销小组经常使用的应用软件引号精灵,之前的老版本就需要开启usb调试模式下使用,现经常新版本不需要了,如果手机没有开启usb调试模 ...

  2. 注册Github过程

    第一步当然是建立自己的账号密码了: 一: github官网地址:https://github.com/ (1)第一步:首先起一个属于自己用户的名字(username),用户名字只能包含字母数字的字符或 ...

  3. UE3客户端加入DS过程

    拉起DS进程 客户端将比赛地图及相关参数发送给ZoneSvr请求开赛,收到消息后,ZoneSvr会分配一个ip和端口号,并与客户端发过来的地图及其他参数,来构建一个命令行来拉起一个DS进程, DS启动 ...

  4. Git代码管理

    持续更新中...   有道笔记链接:http://note.youdao.com/noteshare?id=10a0a86a3499f92cf26371f2698b97d2   Git网上平台 Git ...

  5. 谈谈你对this对象的理解

    理解: 1.this是js 的一个关键字,随着函数的使用场合的不同,this 的值会发生变化. 2.一个总原则:即this指的是调用函数的那个对象. 3.一般情况下,this 是全局对象,可以作为方法 ...

  6. C语言运行库翻译

    这是从Visual C++ 6里面的C语言部分翻译过来. http://files.cnblogs.com/files/sishenzaixian/C运行库.zip

  7. 用一条SQL语句显示所有可能的比赛组合

    一个叫team的表,里面只有一个字段name,一共有4 条纪录,分别是a.b.c.d,对应四个球队,现在四个球队进行比赛,用一条SQL语句显示所有可能的比赛组合. select * from team ...

  8. LeetCode算法题-Hamming Distance(Java实现)

    这是悦乐书的第237次更新,第250篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第104题(顺位题号是461).两个整数之间的汉明距离是相应位不同的位置数.给定两个整数 ...

  9. WebDriverAgent入门篇-安装和使用

    前言 在群里看到WebDriverAgent这个东西,出于好奇,便开始百度+谷歌,最终对其有了简单的了解.也对自动化测试也有了一个初步的了解.接下来你看到的是对WebDriverAgent的一些介绍. ...

  10. Django REST framework基础:认证、权限、限制

    认证.权限和限制 身份验证是将传入请求与一组标识凭据(例如请求来自的用户或其签名的令牌)相关联的机制.然后 权限 和 限制 组件决定是否拒绝这个请求. 简单来说就是: 认证确定了你是谁 权限确定你能不 ...