一道神仙题
题目链接


这个数据很状压啊
但是\(type=2,3\)的有点麻烦.
令\(f[S]\)表示集合为\(S\)的完美匹配期望.
一条边相当于一种转移.
我们考虑把两条边分开计数,各有\(50\%\)的概率出现.
假设第一条边是\((u,v)\),第二条边是\((x,y)\)
如果\(type=2\),那么两条边都出现的概率应该是\(50\%\),然而我们计算的概率是\(25\%\),因此我们要给整个点集加入一个\(25\%\)的偏移量.
同理如果\(type=3\),那么两条边都出现的概率应该是\(0\),那么我们给整个点集加入一个\(-25\%\)的偏移量.
如果这两条边有公共点,那么我们肯定无法同时选择这两条边.那么就不用加偏移量.

然后就可以愉快地状压啦.
状压时有一个常用的小\(trick\)就是钦定转移最高位来减小复杂度.
哦还有一个问题.
我们存不下这个\(dp\)值,开个\(map\)就好啦

代码如下

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<bitset>
#include<set>
#define N (15)
#define P (1000000007)
#define inf (0x7f7f7f7f)
typedef long double ld;
typedef long long LL;
typedef unsigned long long ull;
using namespace std;
namespace fastIO1{inline char read(){static const int IN_LEN=1000000;static char buf[IN_LEN],*s,*t;return (s==t?t=(s=buf)+fread(buf,1,IN_LEN,stdin),(s==t?-1:*s++):*s++);}template<class T>inline void read(T &x){static bool iosig;static char c;for(iosig=false,c=read();!isdigit(c);c=read()){if(c=='-')iosig=true;if(c==-1)return;}for(x=0;isdigit(c);c=read())x=((x+(x<<2))<<1)+(c^'0');if(iosig)x=-x;}inline char readc(char &c){for(c=read();!isalpha(c)&&!isdigit(c);c=read())if(c==-1)return 0;}const int OUT_LEN = 10000000;char obuf[OUT_LEN],*ooh=obuf;inline void print(char c) {if(ooh==obuf+OUT_LEN)fwrite(obuf,1,OUT_LEN,stdout),ooh=obuf;*ooh++=c;}template<class T>inline void print(T x){static int buf[30],cnt;if(x==0)print('0');else{if(x<0)print('-'),x=-x;for(cnt=0;x;x/=10)buf[++cnt]=x%10+48;while(cnt)print((char)buf[cnt--]);}}inline void flush(){fwrite(obuf,1,ooh-obuf,stdout);}
}
namespace fastIO2{template<class T>inline void read(T &x){static bool iosig;static char c;for(iosig=false,c=getchar();!isdigit(c);c=getchar()){if(c=='-')iosig=true;if(c==-1)return;}for(x=0;isdigit(c);c=getchar())x=((x+(x<<2))<<1)+(c^'0');if(iosig)x=-x;}
}
using namespace fastIO1;
const int inv2=(P+1)>>1,inv4=(P+1)>>2;
int n,m,cnt;struct node{LL S;int p;}a[233333];
map<int,int>f[1<<16];
LL calc(int x,int y){return (1ll<<x-1)+(1ll<<(y+n-1));}
int dp(LL S){if(!S)return 1;int L=S>>n,R=S^(L<<n);if(f[L].count(R))return f[L][R];int ans=0;for(int i=1;i<=cnt;i++){LL T=a[i].S;if((T&S)==T&&(T<<1)>S)(ans+=1ll*dp(S^T)*a[i].p%P)%=P;}return f[L][R]=ans;
}
int main(){read(n),read(m);for(int i=1;i<=m;i++){int tp,x,y;LL S;read(tp),read(x),read(y),S=calc(x,y);a[++cnt]=(node){S,inv2};if(tp){int x1,y1,S1; read(x1),read(y1),S1=calc(x1,y1);a[++cnt]=(node){S1,inv2};if(S&S1)continue;a[++cnt]=(node){S|S1,(tp==2?-1:1)*inv4};}}printf("%lld\n",(1ll*(1ll<<n)*dp((1ll<<(2*n))-1)%P+P)%P);
}

转载于:https://www.cnblogs.com/Romeolong/p/10288105.html

THUWC2017 随机二分图相关推荐

  1. [THUWC2017]随机二分图

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

  2. PKUSC2018训练日程(4.18~5.30)

    (总计:共66题) 4.18~4.25:19题 4.26~5.2:17题 5.3~5.9: 6题 5.10~5.16: 6题 5.17~5.23: 9题 5.24~5.30: 9题 4.18 [BZO ...

  3. 省选之前的未完成的计划(截至到省选)

    PLAN OF THE COMING HEOI good problems: -bzoj4823:[Cqoi2017]老C的方块 [*] -bzoj3171:[Tjoi2013]循环格 [*] -bz ...

  4. [总结]2019年9月 OI学习/刷题记录

    从现在开始记录一下每天的学习情况.主力LOJ? 2019/9/5 LibreOJ #2543. 「JXOI2018」排序问题 答案显然是\(\frac{(n+m)!}{Cnt_1!Cnt_2!\cdo ...

  5. KDD 2019 | 结合属性随机游走的图递归网络

    今天给大家介绍德克萨斯A&M大学的Xiao Huang等人在KDD 2019发表的一篇文章"Graph Recurrent Networks with Attributed Rand ...

  6. P2055 [ZJOI2009]假期的宿舍(二分图匹配)

    题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题. 比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不认识 ...

  7. 牛客多校10 - Identical Trees(dp+二分图最小权匹配)

    题目链接:点击查看 题目大意:给出两个同构树 tree1 和 tree2 ,问最少需要改变多少个结点的标号,可以使得这两棵树相同 题目分析:直接 dfs 维护 dp 就好了,dp[ i ][ j ] ...

  8. 二分图最大权匹配算法KM

    有个博客理解起来很棒,描述的生动形象,插眼:https://blog.csdn.net/chenshibo17/article/details/79933191 用处:给定一张二分图,二分图的每一条边 ...

  9. 1433. [ZJOI2009]假期的宿舍【二分图】

    Description 学校放假了······有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如A 和B都是学校的学生,A要回家,而C来看B,C与A不认识.我们假设每个人只能 ...

最新文章

  1. SIFT 特征检测及匹配
  2. Oracle的join默认为,Oracle中的三种Join方法详解
  3. python入门教程共四本书籍-关于 Python 的经典入门书籍有哪些?
  4. Canvas知识点汇总
  5. Linux-sort排序
  6. Linux服务器---网络配置
  7. Linux C :系统调用-fork,wait,subreaper
  8. 天牛须matlab,基于天牛须搜索算法(BAS)优化BP神经网络的权值阈值代码
  9. JavaSE之Java基础(1)
  10. AngularJS快速入门指南09:SQL
  11. python自动登录百度空间
  12. 卷积神经网络中十大令人拍案叫绝的操作
  13. js td innerHTML
  14. 【计算机三级数据库技术】三级数据库技术应用题集锦
  15. js 校验身份证号码
  16. 卡内基梅隆大学计算机硕士专业,2020年卡内基梅隆大学专业设置
  17. 百度地图自定义瓦片切片工具
  18. ENC28J60学习
  19. python图像清晰度_python 图像判断,清晰度(明暗),彩色与黑白实例
  20. oracle ebs克隆报错,Oracle EBS R12.1.1 应用克隆 - 2

热门文章

  1. socket通信原理简介
  2. ❤️20行Python代码❤️一键整理桌面、文件夹❤️世界都清净了❤️
  3. 【网络安全工程师面试合集】安全角度谈UDP、TCP和DHCP协议
  4. SELinux系列(十二)安全上下文的修改和设置(chcon和restorecon命令)
  5. wepe 装linux ubuntu,Ubuntu16.04下安装Wechat的实现方法
  6. 从数据仓库到大数据平台再到数据中台(内附13张架构图)
  7. 13分钟,教你python可视化分析20W数据,找到妹子最爱的内衣
  8. Bootstrap Table事件
  9. Flex Java Servlet 实现简单图片编辑
  10. linux opencv移植教程,OpenCV在Ubuntu和Linux系统下的移植