题目链接

LOJ:https://loj.ac/problem/2290

洛谷:https://www.luogu.org/problemnew/show/P4547

Solution

首先考虑只有第一类边的情况,那么每种完美匹配一定会由\(n\)个边组组成,概率就是\(1/2^n\),对答案贡献为\(1\),那么问题就转化成了统计完美匹配个数。

设\(f[s1][s2]\)表示当前左边情况为\(s1\),右边为\(s2\),在把其他的点填满可以得到的完美匹配的种类数,然后就是普及组\(dp\),复杂度\(O(2^{2n})\),但是这样会重复计数,而且复杂度不对。

如果我们把\(s1\)严格每次都从高位到低位转移,然后上记忆化搜索,复杂度可以降到\(O(2^n\cdot n^2)\),且不会重复计数。

考虑其他两类边,我们硬点这些边都是单独的,概率\(50\%\),但是这样会算不对,第二类边组在两条边都选的时候贡献的概率为\(25\%\),但是应该是\(50\%\),所以我们多加一个\(25\%\)的边组就好了,同理第三类边组添加一个概率为\(-25\%\)的边组,然后改一改上面的\(dp\),记搜转移就好了,\(f\)开不下可以用\(\rm map\)。

#include<bits/stdc++.h>
using namespace std; void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
} void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');} #define lf double
#define ll long long #define pii pair<int,int >
#define vec vector<int > #define pb push_back
#define mp make_pair
#define fr first
#define sc second #define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++) const int maxn = 1e4+10;
const int inf = 1e9;
const lf eps = 1e-8;
const int mod = 1e9+7;
const int inv2 = 5e8+4;
const int inv4 = 2.5e8+2; int add(int x,int y) {return x+y>=mod?x+y-mod:x+y;}
int del(int x,int y) {return x-y<0?x-y+mod:x-y;}
int mul(int x,int y) {return 1ll*x*y-1ll*x*y/mod*mod;} map<int,int > f; int a[maxn],b[maxn],cnt,n,m; int dfs(int s) {
if(s==(1<<(n<<1))-1) return 1;
if(f.find(s)!=f.end()) return f[s];int now=0,ans=0;
for(int i=n-1;~i;i--) if(!(s&(1<<i))) {now=1<<i;break;}
for(int i=1;i<=cnt;i++)
if(!(a[i]&s)&&(now&a[i])) ans=add(ans,mul(b[i],dfs(s|a[i])));
return f[s]=ans;
} int main() {
read(n),read(m);
for(int i=1,s,s2,t,x,y;i<=m;i++) {
read(t),read(x),read(y);x--,y--;
s=1<<x|(1<<(y+n));a[++cnt]=s,b[cnt]=inv2;
if(!t) continue;read(x),read(y);x--,y--;
s2=1<<x|(1<<(y+n));a[++cnt]=s2,b[cnt]=inv2;
if(s&s2) continue;
a[++cnt]=s|s2,b[cnt]=t==1?inv4:mod-inv4;
}write(mul(dfs(0),(int)pow(2,n)));
return 0;
}

[LOJ2290] [THUWC2017] 随机二分图的更多相关文章

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

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

  2. [THUWC2017]随机二分图

    题目大意 给一张二分图,有左部点和右部点. 有三种边,第一种是直接从左部点连向右部点,出现概率为50%. 第二种边一组里有两条边,这两条边同时出现或者不出现,概率都是50%. 第三种边一组里有两条边, ...

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

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

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

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

  5. THUWC2017随机二分图

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

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

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

  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. 【JZOJ6225】【20190618】计数

    题目 对于一个01串,定义\(f(s)\)为\(f(s) = \sum_{i=0}^{\lfloor \frac{|s|}{2} \rfloor -1 }[s_i=s_{|s|-1-i}]\) 定义\ ...

  2. 去参加了十四届D2前端大会~

    朋友喊我去一起去d2,原来一直在加班,没有想去的动力,后来业务上线,幸运的入手了别人转的一张票(也不便宜啊)- 讲了五个挑战 端侧渲染体系的重塑,从PC时代到无线时代,再到未来的IOT时代,在渲染方面 ...

  3. Android自动化测试--monkey总结

    什么是 Monkey Monkey 是一个 Android 自动化测试小工具.主要用于Android 的压力测试, 主要目的就是为了测试app 是否会Crash. Monkey 特点 顾名思义,Mon ...

  4. mqtt 与 MQ 的区别

    mqtt 与 MQ 的区别: mqtt:一种通信协议,类似人类交谈中的汉语.英语.俄语中的一种语言规范MQ:一种通信通道,也叫消息队列,类似人类交谈中的用电话.email.微信的一种通信方式json: ...

  5. RSA前台加密后台解密

    RSA解密时BadPaddingException java rsa 解密报:javax.crypto.BadPaddingException: Decryption error Java安全架构__ ...

  6. Java与.net 关于URL Encode 的区别

    在c#中,HttpUtility.UrlEncode("www+mzwu+com")编码结果为www%2bmzwu%2bcom,在和Java开发的平台做对接的时候,对方用用url编 ...

  7. java获取ubuntu某个目录下的所有文件信息

    java获取ubuntu某个目录下的所有文件信息 public List<VCFile> getAllFiles(String basicDirName) { List<VCFile ...

  8. 伟程君解决端口被占用问题(接口jmeter 本地端口被占用完了,jmeter报错的问题)(亲测是可以的)

    1.在目录下创建文件local.conf(没有就创建目录和文件) touch /etc/sysctl.d/local.conf mkdir(创建文件夹) touch(创建文件) 2.往local.co ...

  9. 【448】NLP, NER, PoS

    目录: 停用词 —— stopwords 介词 —— prepositions —— part of speech Named Entity Recognition (NER) 3.1 Stanfor ...

  10. express 413 Request Entity Too Large解决办法

    1.配置nginx 原因是请求实体太长了.一般出现种情况是Post请求时Body内容Post的数据太大了 如上传大文件过大; 如POST数据比较多 处理方法修改nginx.conf的值就可以解决了. ...