【THUWC2017】随机二分图(动态规划)
【THUWC2017】随机二分图(动态规划)
题面
题解
如果每天边的限制都是\(0.5\)的概率出现或者不出现的话,可以把边按照二分图左侧的点的编号排序,然后设\(f[i][S]\)表示左边的前\(i\)个点中,匹配了右侧的点集\(S\)的方案数。每次枚举一条边进行转移。为了防止在点集中重复转移,强行只用\(lowbit(S)\)的出边进行转移。
现在有了边组。还是把他们拆成两条概率为\(0.5\)的边。
然后发现第二类边组少算了\(0.25\)的贡献,第三类多算了\(0.25\)的贡献。
把两条边强制放在一起算补进来贡献就好了。
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
#define pi pair<int,int>
#define fr first
#define sd second
#define mp make_pair
const int MOD=1000000007,inv2=500000004,inv4=250000002;
map<pi,int> f;
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int tot,n,m,bin[20];
pi E[1000];int W[1000];
int lb(int x){return x&(-x);}
bool In(int S,int T){return (S|T)==T;}
int dfs(int S,int T)
{
if(!S&&!T)return 1;
if(f.find(mp(S,T))!=f.end())return f[mp(S,T)];
int ret=0;
for(int i=1;i<=tot;++i)
if(In(E[i].fr,S)&&In(E[i].sd,T)&&(E[i].fr&lb(S)))
ret=(ret+1ll*W[i]*dfs(S^E[i].fr,T^E[i].sd))%MOD;
return f[mp(S,T)]=ret;
}
int main()
{
n=read();m=read();
for(int i=1;i<=n+1;++i)bin[i]=1<<(i-1);
for(int i=1;i<=m;++i)
{
int opt=read(),x=read(),y=read();
E[++tot]=mp(bin[x],bin[y]);W[tot]=inv2;
if(opt==0)continue;
int u=read(),v=read();
E[++tot]=mp(bin[u],bin[v]);W[tot]=inv2;
if(x==u||v==y)continue;
E[++tot]=mp(bin[x]|bin[u],bin[y]|bin[v]);
W[tot]=opt==1?inv4:MOD-inv4;
}
int ans=1ll*bin[n+1]*dfs(bin[n+1]-1,bin[n+1]-1)%MOD;
printf("%d\n",ans);
return 0;
}
【THUWC2017】随机二分图(动态规划)的更多相关文章
- [THUWC2017]随机二分图
题目大意 给一张二分图,有左部点和右部点. 有三种边,第一种是直接从左部点连向右部点,出现概率为50%. 第二种边一组里有两条边,这两条边同时出现或者不出现,概率都是50%. 第三种边一组里有两条边, ...
- Luogu4547 THUWC2017 随机二分图 概率、状压DP
传送门 考虑如果只有$0$组边要怎么做.因为$N \leq 15$,考虑状压$DP$.设$f_i$表示当前的匹配情况为$i$时的概率($i$中$2^0$到$2^{N-1}$表示左半边的匹配情况,$2^ ...
- BZOJ5006 THUWC2017随机二分图(概率期望+状压dp)
下称0类为单边,1类为互生边,2类为互斥边.对于一种匹配方案,考虑其出现的概率*2n后对答案的贡献,初始为1,如果有互斥边显然变为0,否则每有一对互生边其贡献*2.于是有一个显然的dp,即设f[S1] ...
- THUWC2017随机二分图
题面链接 洛谷 sol 唯一的重点是拆边... 0的不管,只看1.2. 先无论如何把两条边的边权赋为\(0.5\)然后我们发现如果两个都选了. 对于第一种边,我们发现如果\(\frac{1}{2} * ...
- [BZOJ5006][LOJ#2290][THUWC2017]随机二分图(概率+状压DP)
https://loj.ac/problem/2290 题解:https://blog.csdn.net/Vectorxj/article/details/78905660 不是很好理解,对于边(x1 ...
- [LOJ2290] [THUWC2017] 随机二分图
题目链接 LOJ:https://loj.ac/problem/2290 洛谷:https://www.luogu.org/problemnew/show/P4547 Solution 首先考虑只有第 ...
- [思路题][LOJ2290][THUWC2017]随机二分图:状压DP+期望DP
分析 考虑状压DP,令\(f[sta]\)表示已匹配状态是\(sta\)(\(0\)代表已匹配)时完美匹配的期望数量,显然\(f[0]=1\). 一条边出现了不代表它一定在完美匹配内,这也导致很难去直 ...
- P4547 [THUWC2017]随机二分图(状压,期望DP)
期望好题. 发现 \(n\) 非常小,应该要想到状压的. 我们可以先只考虑 0 操作. 最难的还是状态: 我们用 \(S\) 表示左部点有哪些点已经有对应点, \(T\) 表示右部点有哪些点已经有对应 ...
- 题解 洛谷 P4547 【[THUWC2017]随机二分图】
根据题意,题目中所求的即为所有\(n!\)种完美匹配的各自的出现概率之和再乘上\(2^n\)的值. 发现\(n\)很小,考虑状压\(DP\).设\(f_{S,T}\)为左部图匹配情况为\(S\),右部 ...
随机推荐
- 【学习总结】Git学习-参考廖雪峰老师教程九-使用码云
学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...
- StackWalk64
#include <Windows.h> #define PULONG_PTR ULONG** #define PULONG ULONG* #define ULONG_PTR U ...
- VMware虚拟机与Windows文件共享
开发中,我们经常的需求是这样的:我想再Windows中进行快捷开发,但是想在linux中运行,那么需要将文件方便在linux中管理,基本可以分成两种方式: 1. 使用网络工具:vmware_tool工 ...
- laravel自定义门面
https://learnku.com/articles/19195 关于laravel门面和服务提供者使用的一点见解,门面之词,不足之处,还请多多指教. 在laravel中,我们可能需要用到自己 ...
- Linux 查询oracle错误日志&警告日志
1 通过命令查看错误日志目录:show parameter background_dump_dest /usr/oracle/app/diag/rdbms/orcl/orcl/trace 2 根据 ...
- [转帖]Oracle 裁员史:技术人死于重组,卒于云计算
Oracle 裁员史:技术人死于重组,卒于云计算 https://www.infoq.cn/article/tm-mcdHCPCI4eEwr6dbY 大厂裁员 我妈妈也总担心我没工作了 怎么还房贷 田 ...
- 【面试】MySQL的事务和索引
MySQL事务 MySQL事务主要用于处理操作量大,复杂度高的数据. 比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这些数据库操作 ...
- vue嵌套路由
父组件 (注:to="/Flow/moban_a"这里不是文件加路径,是父组件路由+子组件路由) 路由配置
- java 中 的 字节流!
package cn.zhouzhou; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- MyBatis Generator报错:Cannot instantiate object of type
[ERROR] Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate ( ...