THUWC2017 随机二分图

当 t=1 时,可以将 t=1 的组拆成两个 t=0 的组,但是如果两条边都出现在完美匹配中,它对总概率的贡献是14,但是实际上是12,这样就出锅了,我们可以考虑再加入一个包含了这两条边的,若这个东西在完美匹配中,贡献是14,注意到14+14=12,就没有问题了

当 t=2 时,两条边都在完美匹配的贡献实际是0,但我们计算的是14,所以我们再加入一个贡献为14

考虑状压dp,令fs,t表示,目前已在完美匹配中的左侧点集为s,右侧点集为t,转移的话就是令 s 中第一个为 0 的位置为 p,那么下一次加入的边要包含 p 并且不与 st 有交

看上去时间复杂度爆炸,但是每次搜索的时候一定要保证bitcount(s)=bitcount(t)的,所以状态并不会很多,再加上一个记忆化就过去了

点击查看代码
//CAN'T FORGET
//CAN'T FORGET
//CAN'T FORGET

//#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;
#define _ 0
const long long mod=1e9+7;
const long long inv2=5e8+4;
const long long maxn=1e5+5;
const long long inv4=2.5e8+2;
const long long inf=0x3f3f3f3f;
inline long long read()
{
	long long x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
struct node{
	long long S,p;
}a[maxn];
unordered_map<long long,long long> dp;
long long n,m,nm;
long long calc(long long x,long long y)
{
	return (1<<(x-1))+(1<<(y+n-1));
}
long long dfs(long long S)
{
	if(dp[S])
		return dp[S];
	long long ans=0;
	for(long long i=1;i<=nm;i++)
	{
		long long T=a[i].S;
		if((T&S)==T&&(T<<1)>S)
			(ans+=dfs(S^T)*a[i].p%mod)%=mod;
	}
	dp[S]=ans;
	return ans;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
//	freopen("bipartite.in","r",stdin);
//	freopen("bipartite.out","w",stdout);
    cin>>n>>m;
    dp[0]=1;
    while(m--)
    {
    	long long op,x,y;
    	cin>>op>>x>>y;
    	long long S=calc(x,y);
    	a[++nm]=(node){S,inv2};
    	if(op!=0)
    	{
    		cin>>x>>y;
    		long long S1=calc(x,y);
    		a[++nm]=(node){S1,inv2};
    		if(S&S1)
    			continue;
    		long long w=inv4;
    		if(op==2)
    			w=-w;
    		a[++nm]=(node){S|S1,w};
		}
	}
	long long ans=(1<<n)*dfs((1<<(2*n))-1)%mod;
	ans=(ans+mod)%mod;
	cout<<ans<<endl;
	return ~~(0^_^0);
}
/*
Notes:
1.看所有题目
2.注意数据范围
3.想想自己还能做什么而不是做了什么
4.看清题目!!!
5.记得把调试代码删掉!!!!
6.longlong时 1要写成1ll
7.Think twice code once, think once code forever!
*/

posted @   zxi8_May  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示