[BZOJ5006][LOJ#2290][THUWC2017]随机二分图(概率+状压DP)
题解:https://blog.csdn.net/Vectorxj/article/details/78905660
不是很好理解,对于边(x1,y1)和(x2,y2),可以分“x1或y1已匹配”,“x2或y2已匹配”,“x1,x2,y1,y2均未匹配”三种情况考虑拆边的正确性。
状压的时候,对于当前左边已经匹配的集合,只需要枚举左边已匹配的最后一个是用哪条边匹配的即可,也就是程序里的S<(1<<T)。
不要用顺推,记忆化搜索会忽略一些用不到的状态,所以会快一些。
#include<map>
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
using namespace std; const int N=,mod=,inv2=(mod+)>>,inv4=(mod+)>>;
int n,m,cnt,t,x,y;
struct E{ int S,p,c; E(int _S=,int _p=,int _c=):S(_S),p(_p),c(_c){} }G[N*N<<];
map<int,int>f[<<N]; inline void add(int &x,int y){ x+=y; if (x>=mod) x-=mod; }
int F(int S){
if (!S) return ;
int T0=S>>n,S0=S^(T0<<n);
if (f[S0].count(T0)) return f[S0][T0];
int res=;
rep(i,,cnt){
int T=G[i].S;
if ((T&S)==T && S<(T<<)) add(res,1ll*F(S^T)*G[i].p%mod);
}
return f[S0][T0]=res;
} int main(){
freopen("bzoj5006.in","r",stdin);
freopen("bzoj5006.out","w",stdout);
scanf("%d%d",&n,&m);
rep(i,,m){
scanf("%d%d%d",&t,&x,&y);
int S1=(<<(x-))|(<<(y+n-)); G[++cnt]=E(S1,inv2,);
if (t){
scanf("%d%d",&x,&y);
int S2=(<<(x-))|(<<(y+n-)); G[++cnt]=E(S2,inv2,);
if (S1 & S2) continue;
G[++cnt]=E(S1|S2,((t==)?inv4:mod-inv4),);
}
}
printf("%lld\n",(1ll<<n)*F((<<(n*))-)%mod);
return ;
}
[BZOJ5006][LOJ#2290][THUWC2017]随机二分图(概率+状压DP)的更多相关文章
- [思路题][LOJ2290][THUWC2017]随机二分图:状压DP+期望DP
分析 考虑状压DP,令\(f[sta]\)表示已匹配状态是\(sta\)(\(0\)代表已匹配)时完美匹配的期望数量,显然\(f[0]=1\). 一条边出现了不代表它一定在完美匹配内,这也导致很难去直 ...
- P4547 [THUWC2017]随机二分图(状压,期望DP)
期望好题. 发现 \(n\) 非常小,应该要想到状压的. 我们可以先只考虑 0 操作. 最难的还是状态: 我们用 \(S\) 表示左部点有哪些点已经有对应点, \(T\) 表示右部点有哪些点已经有对应 ...
- Luogu4547 THUWC2017 随机二分图 概率、状压DP
传送门 考虑如果只有$0$组边要怎么做.因为$N \leq 15$,考虑状压$DP$.设$f_i$表示当前的匹配情况为$i$时的概率($i$中$2^0$到$2^{N-1}$表示左半边的匹配情况,$2^ ...
- 【洛谷5492】[PKUWC2018] 随机算法(状压DP)
点此看题面 大致题意: 用随机算法求一张图的最大独立集:每次随机一个排列,从前到后枚举排列中的点,如果当前点加入点集中依然是独立集,就将当前点加入点集中,最终得到的点集就是最大独立集.求这个随机算法的 ...
- Codeforces Round #363 LRU(概率 状压DP)
状压DP: 先不考虑数量k, dp[i]表示状态为i的概率,状态转移方程为dp[i | (1 << j)] += dp[i],最后考虑k, 状态表示中1的数量为k的表示可行解. #incl ...
- NOIP2016提高A组 A题 礼物—概率状压dp
题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生 日礼物. 商店里一共有n种礼物.夏川每得到一种礼物,就会获得相应喜悦值Wi(每种礼物的喜悦值不能重复获得). 每次,店员会 ...
- loj2540 「PKUWC2018」随机算法 【状压dp】
题目链接 loj2540 题解 有一个朴素三进制状压\(dp\),考虑当前点三种状态:没考虑过,被选入集合,被排除 就有了\(O(n3^{n})\)的转移 但这样不优,我们考虑优化状态 设\(f[i] ...
- POJ2794 Double Patience[离散概率 状压DP]
Double Patience Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 694 Accepted: 368 Cas ...
- LOJ2540 [PKUWC2018] 随机算法 【状压DP】
题目分析: 听说这题考场上能被$ O(4^n) $的暴力水过,难不成出题人是毕姥爷? 首先思考一个显而易见的$ O(n^2*2^n) $的暴力DP.一般的DP都是考虑最近的加入了哪个点,然后删除后递归 ...
随机推荐
- 获取本地ip地址 C#
与ipconfig获取的所有信息一致的方法: private void GetIp() { System.Diagnostics.Process cmdp= new System.Diagnostic ...
- android studio的弹出层
<activity android:name=".SecondActivity" android:theme="@style/Theme.AppCompat.Dia ...
- CentOS 安装 debuginfo-install
安装debuginfo相关的包步骤如下: 1. 修改文件/etc/yum.repos.d/CentOS-Debuginfo.repo中的enabled参数,将其值修改为1 2. 使用命令: yum i ...
- video视频在结束之后回到初始状态
目前尝试了两种解决方案,但是方案1在安卓移动端无法生效(猜测是因为移动端安卓启动的是原生的视频播放控件的原因) 方案一: 重新load资源,这种方法比较简洁,但是在安卓下不适用 video.addEv ...
- codeforces613B - Skills &&金中市队儿童节常数赛
题目传送门 本随笔写的是第二题...... 这道题方法就是搞乱....因为n较mxa小 所以枚举达到最大上限的点 然后就乱搞 代码看看咯 #include<cstdio> #include ...
- DotNETCore 学习笔记 异常处理
Error Handling public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseIISP ...
- JHDU 2601 An easy problem (数学 )
title: An easy problem 数学 杭电2601 tags: [数学] 题目链接 Problem Description When Teddy was a child , he was ...
- react框架
react 其实react=vue, 区别:vue- 双向数据绑定, react 单向数据绑定. 中文文档:https://react.docschina.org/ 第一步:安装方式,不能直接引入 ...
- linux下命令源码
一般来说,不同的命令可能隶属于不同的软件包,这样就没有一个地方会有所有命令的源代码.(命令的个数也会与你所安装的软件包有关)但是,一些常用的命令,例如basename cat chgrp chmod ...
- docker从零开始网络(六)Macvlan
使用Macvlan网络 某些应用程序,尤其是遗留应用程序或监视网络流量的应用程序,希望直接连接到物理网络.在这种情况下,您可以使用macvlan网络驱动程序为每个容器的虚拟网络接口分配MAC地址,使其 ...