题目大意

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

有三种边,第一种是直接从左部点连向右部点,出现概率为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. 定时删除所有文件夹下的_desktop.ini文件

    写个批处理,删除对应的文件,命名为DELDesktopIni.bat,存于D盘根目录 @echo off :delini for %%a in ( C: D: E: ) DO ( del /f/s/a ...

  2. Got a packet bigger than‘max_allowed_packet’bytes错误的解决方法

    通常项目上线前都有一些初始化数据需要导入,在今天博客系统发布前我使用sqlyog工具远程登录服务器的Mysql数据库,执行sql脚本对初始数据进行导入的时候报错: Got a packet bigge ...

  3. XPath Helper的安装与使用

    摘要 : XPath Helper可以支持在网页点击元素生成xpath,整个抓取使用了xpath.正则表达式.消息中间件.多线程调度框架的chrome插件. xpath:是一门XML和HTML文档中查 ...

  4. 【原】Java学习笔记010 - 数组

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 需求:一堆分数,要 ...

  5. 网络编程 单纯UDP通信

    网络编程 单纯UDP通信 1,UDP发送端 2,UDP接收端 UDP发送端: #include <stdio.h> #include <unistd.h> #include & ...

  6. GoldenDict词典的超级实用高级玩法----全文搜索功能

    快捷键: Ctrl+Shift+F 菜单进入:搜索--全文搜索 模式:正则表达式 比如:我想知道地道的英文表达    请xx天/周/年假 给搜索框写入正则表达式   请(.)(天|周|年)假 就可以了 ...

  7. 安装指定版本的docker服务

    参考博客:Docker CE 镜像源站 参考博客:docker启动异常driver not supported 1. 说明 之前部署docker服务的时候都是安装最新的docker版本,并使用dock ...

  8. SQLServer之创建AFETER DELETE触发器

    DML AFTER DELETE触发器创建原理 触发器触发时,系统自动在内存中创建deleted表或inserted表,inserted表临时保存了插入或更新后的记录行,deleted表临时保存了删除 ...

  9. 力扣算法题—079单词搜索【DFS】

    给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被重复使用. ...

  10. 产品设计-后台管理权限设计RBAC

    最近在做OA系统,设计到不同的员工会拥有不同权限对OA进行操作,总结了一下整体的设计 做权限的分配就是为了更好的管理不同类别的员工,如人事部可以看到普通员工的薪酬,可以查看全部员工的考勤数据请假等,而 ...