题意:有一个左右各n个点的二分图,对于连边组有一些性质:1号组的一条边,有50%的概率出现。2号组两条边,有50%的概率同时出现,50%的概率同时不出现。3号组两条边,有50%的概率出现第一条,有50%的概率出现第二条。问完美匹配(所有点都有匹配)方案数的期望*2^n。n<=15。

标程:

 #include<cstdio>
#include<map>
using namespace std;
typedef long long ll;
const int mod=1e9+;
const int inv2=5e8+;
const int inv4=25e7+;
const int inv_4=75e7+;
const int N=;
int read()
{
int x=;char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (''<=ch&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
return x;
}
struct node{int v,p;node(){}node(int A,int B){v=A;p=B;}}e[N];
map<int,int> mp;
int n,m,op,x,y,cnt,id,id2;
int dp(int zt)
{
if (!zt) return ;
map<int,int>::iterator t=mp.find(zt);
if (t!=mp.end()) return t->second;
int ans=;
for (int i=;i<=cnt;i++)
if ((e[i].v&zt)==e[i].v&&e[i].v*>zt)
ans=((ll)ans+(ll)dp(zt^e[i].v)*e[i].p%mod)%mod;
return mp[zt]=ans;
}
int main()
{
n=read();m=read();
for (int i=;i<=m;i++)
{
op=read();x=read();y=read();
id=(<<x-)|(<<n+y-);
e[++cnt]=node(id,inv2);
if (op)
{
x=read(),y=read();
id2=(<<x-)|(<<n+y-);
e[++cnt]=node(id2,inv2);
if (!(id&id2))//有重合端点的话不用考虑
if (op==) e[++cnt]=node(id|id2,inv4);
else e[++cnt]=node(id|id2,inv_4);
}
}
printf("%d\n",((ll)dp((<<(*n))-)<<n)%mod);
return ;
}

易错点:1.注意2和3组的两条边如果有重复端点的话是不用考虑加组合边的,一定不会同时选这两条边。

题解:dp

如果都是1号组的点,也就是边没有依赖出现关系。那么直接dp。f[state]表示在state的匹配状态下完美匹配数的期望。

为了不算重,按照套路应该选取一个特殊点v,比如编号最大点、lowbit等。

f[state]=sigma(f[state^v^match_v]*p),p=50%,match_v表示与v相连的另一点。

状态数有sigma(C(n,i)^2)=sigma(C(n,i)*C(n,n-i))=范德蒙德卷积形式=C(2n,n)≈1.6*1e8,用map记录改成记忆化搜索就好了。

冷静分析第2组点和第3组点的特征:对于第2组点,如果两条边都不选或只选一条,概率则为0和50%和组1的情况一样;但当两条都选时,组1的概率为50%*50%=25%,而实际应该是50%,对策是再加一条包含这两条边的组合边,概率为25%,这样两种加起来就是50%了。

同理对于第3组点,如果都不选或只选一条,概率是等同于组1的选法。而都选的概率应该是0,于是加一条概率为-25%的组合边。

按照组1的情况转移即可。

loj2290 随机二分图的更多相关文章

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

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

  2. 「THUWC 2017」随机二分图

    「THUWC 2017」随机二分图 解题思路 : 首先有一个 \(40pts\) 的做法: 前 \(20pts\) 暴力枚举最终的匹配是怎样的,check一下计算方案数,后 \(20pts\) 令 \ ...

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

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

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

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

  5. bzoj5006: [THUWC2017 Bipartite]随机二分图

    某人在玩一个非常神奇的游戏.这个游戏中有一个左右各 nnn 个点的二分图,图中的边会按照一定的规律随机出现. 为了描述这些规律,某人将这些边分到若干个组中.每条边或者不属于任何组 (这样的边一定不会出 ...

  6. @loj - 2290@ 「THUWC 2017」随机二分图

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个左右各 n 个点的二分图,图中的边会按照一定的规律随机出现. ...

  7. [THUWC2017]随机二分图

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

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

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

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

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

随机推荐

  1. 2018-2019-2-20175323 java实验四 Android程序设计

    (一)安装及配置Andriod Studio,执行HelloWorld 我选择的安装网址下载了3.2.0版本的Andriod Studio 此处应该选择cancel 报错 点击所给链接,安装相应SDK ...

  2. UvaLive6893_The_Big_Painting

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:传送门  Portal  原题目描述在最下面.  给你两个二 ...

  3. 反射Reflection

    using System; using System.Collections.Generic; using System.Linq; using System.Reflection;// <-- ...

  4. 剑指offer——30包含min函数的栈

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)).   题解: 借助辅助栈,新的数据<=f辅助栈顶时,就压入辅助栈,这样,就能保证辅 ...

  5. Git 学习(一)安装 Git

    这里写自定义目录标题 这一章介绍怎么安装 Git 大家都是开发老司机,就不简介什么是 Git 了,直接开花. 在 Linux 上安装Git 在 Windows 上安装 Git 初次使用 Git 前的配 ...

  6. Solrj API读取core 索引库数据

    private static String zkHost = "ip:2181,ip:2181,ip:2181"; private static CloudSolrServer s ...

  7. 为kubectl配置别名和命令行补齐

    配置别名 # vim ~/.bashrc 添加 alias k='kubectl' # source ~/.bashrc 配置命令行补齐 # yum install -y bash-completio ...

  8. DLL和OCX注册

    在注册DLL或者OCX的方法应该使用regsvr32.exe,使用得多了一定会觉得在cmd运行中写一长串东西很烦人吧!这里向大家介绍一种麻烦一次方便一生的方法.这个方法只要右击你想注册或者反注册的DL ...

  9. QT之发布

    https://blog.csdn.net/qq_40194498/article/details/79926054打开windows控制台直接输入 windeployqt --help 可以知道想要 ...

  10. Android开发 自定义View_白色圆型涟漪动画View

    代码: import android.animation.ValueAnimator; import android.content.Context; import android.graphics. ...