THUWC2017 随机二分图
当 t=1 时,可以将 t=1 的组拆成两个 t=0 的组,但是如果两条边都出现在完美匹配中,它对总概率的贡献是,但是实际上是,这样就出锅了,我们可以考虑再加入一个包含了这两条边的,若这个东西在完美匹配中,贡献是,注意到,就没有问题了
当 t=2 时,两条边都在完美匹配的贡献实际是0,但我们计算的是,所以我们再加入一个贡献为
考虑状压dp,令表示,目前已在完美匹配中的左侧点集为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!
*/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通