下称0类为单边,1类为互生边,2类为互斥边。对于一种匹配方案,考虑其出现的概率*2n后对答案的贡献,初始为1,如果有互斥边显然变为0,否则每有一对互生边其贡献*2。于是有一个显然的dp,即设f[S1][S2]为左边选取S1右边选取S2对答案的贡献。转移时考虑S1中编号最小的点x与右边的点y匹配。首先将f[S1-(1<<x)][S2-(1<<y)]统计进去。然后若(x,y)是单边,或者虽存在互生互斥关系,但其对应边的左端点还不在S1中或就是x,或右端点还不在S2中或就是y,就不管了;否则若互斥将f[S1-(1<<x)-(1<<x')][S2-(1<<y)-(1<<y')]减掉,若互生将f[S1-(1<<x)-(1<<x')][S2-(1<<y)-(1<<y')]加上,其中(x',y')是(x,y)的对应边。这样大概就是C(30,15)*15的。

  但是这只有暴力20分,甚至连空间都开不下。然而满分做法和他是一个复杂度的。对上面的做法改为记忆化搜索,map存储状态就可以了。多了log也多了80分。不是非常理解意义何在。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
#define ll long long
#define N 15
#define P 1000000007
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,typ[N][N],match[N][N][],s[<<N];
map<int,int> f;
void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
inline int trans(int n,int m){return n<<N|m;}
int solve(int i,int j)
{
if (f.find(trans(i,j))!=f.end()) return f[trans(i,j)];
int x=i&-i,ans=;
for (int t=j,k=t&-t;t;t^=k,k=t&-t)
if ((k&j)&&typ[s[x]][s[k]]>=)
{
inc(ans,solve(i^x,j^k));
int u=match[s[x]][s[k]][],v=match[s[x]][s[k]][];
if ((u&i)&&(v&j)&&x!=u&&k!=v)
{
if (typ[s[x]][s[k]]==) inc(ans,solve(i^x^u,j^k^v));
if (typ[s[x]][s[k]]==) inc(ans,P-solve(i^x^u,j^k^v));
}
}
f[trans(i,j)]=ans;return ans;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj5006.in","r",stdin);
freopen("bzoj5006.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read();
memset(typ,,sizeof(typ));
for (int i=;i<=m;i++)
{
int op=read(),x=read()-,y=read()-;
if (op==) typ[x][y]=;
else
{
int p=read()-,q=read()-;
typ[x][y]=typ[p][q]=op;
match[x][y][]=<<p,match[x][y][]=<<q;
match[p][q][]=<<x,match[p][q][]=<<y;
}
}
for (int i=;i<n;i++) s[<<i]=i;
f[]=;
cout<<solve((<<n)-,(<<n)-);
return ;
}

BZOJ5006 THUWC2017随机二分图(概率期望+状压dp)的更多相关文章

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

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

  2. BZOJ3925: [Zjoi2015]地震后的幻想乡【概率期望+状压DP】

    Description 傲娇少女幽香是一个很萌很萌的妹子,而且她非常非常地有爱心,很喜欢为幻想乡的人们做一些自己力所能及的事情来帮助他们. 这不,幻想乡突然发生了地震,所有的道路都崩塌了.现在的首要任 ...

  3. 2018.09.23 bzoj1076: [SCOI2008]奖励关(期望+状压dp)

    传送门 一道神奇的期望状压dp. 用f[i][j]f[i][j]f[i][j]表示目前在第i轮已选取物品状态为j,从现在到第k轮能得到的最大贡献. 如果我们从前向后推有可能会遇到不合法的情况. 所以我 ...

  4. 【xsy1596】旅行 期望+状压DP

    题目大意:有$m$个人要从城市$1$开始,依次游览城市$1$到$n$. 每一天,每一个游客有$p_i$的概率去下一个城市,和$1-p_i$的概率结束游览. 当游客到达城市$j$,他会得到$(1+\fr ...

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

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

  6. “景驰科技杯”2018年华南理工大学程序设计竞赛 A. 欧洲爆破(思维+期望+状压DP)

    题目链接:https://www.nowcoder.com/acm/contest/94/A 题意:在一个二维平面上有 n 个炸弹,每个炸弹有一个坐标和爆炸半径,引爆它之后在其半径范围内的炸弹也会爆炸 ...

  7. 状压DP小拼盘

    有的DP题,某一部分的状态只有两种,选或不选. 开数组记录,代价太大,转移不方便. 状态压缩意为,用 “0/1“ 表示 “选/不选“ . 把状态表示为二进制整数. There are 10 kinds ...

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

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

  9. BZOJ1076 [SCOI2008]奖励关 【状压dp + 数学期望】

    1076: [SCOI2008]奖励关 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 3074  Solved: 1599 [Submit][Sta ...

随机推荐

  1. Jenkins安全

    Jenkins安全 在Jenkins中,可在 Jenkins 实例建立用户和他们的相关权限.默认情况下,不希望每个人都能够在 Jenkins 中定义工作或其他管理任务.因此,Jenkins 必须有一个 ...

  2. X509证书申请以及PKCS#10 详解

    一.证书颁发 1.单证书的签发 1) 用户填写信息注册(或者由RA的业务操作员注册用户). 2) 用户信息传递到RA. 3) RA审核通过. 4) 用户请求发证. 5) RA审核通过. 6) 用户签发 ...

  3. 阿里路由框架ARouter的使用步骤

    ARouter的使用步骤(以宿主APP modulebase和moduleuser 三大模块组成的工程为例) 第一步 因为路由跳转是子模块都需要用到的,所以我们在module_base模块中引入 co ...

  4. ios有些机型input和fixed导致的页面错位问题

    _fixIosInputH () { let [timeout, beforeTop] = [null, 0] $('input, textarea').on('focus', () => { ...

  5. CSS基础范例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Python机器学习库SKLearn:数据集转换之管道和特征

    转载自:https://blog.csdn.net/cheng9981/article/details/61918129 4.1 管道和特征:组合估计量 4.1.1 管道:链接估计 管道可以用于将多个 ...

  7. 【Python3.6】python打包成exe

    D:\python_test>pip3 install pyinstaller…………D:\python_test>pyinstaller -F -w ui.py INFO: PyInst ...

  8. Java多线程编程之不可变对象模式

           在多线程环境中,为了保证共享数据的一致性,往往需要对共享数据的使用进行加锁,但是加锁操作本身就会带来一定的开销,这里可以使用将共享数据使用不可变对象进行封装,从而避免加锁操作. 1. 模 ...

  9. django_models后台管理myarya

    arya重点代码 # urls.py from django.urls import path,re_path,include from arya.service import v1 urlpatte ...

  10. 插件使用-HighChart

    一.介绍 让数据可视化更简单,兼容 IE6+.完美支持移动端.图表类型丰富.方便快捷的 HTML5 交互性图表库. 官网(英):https://www.highcharts.com/download ...