loj2290 随机二分图
题意:有一个左右各n个点的二分图,对于连边组有一些性质:1号组的一条边,有50%的概率出现。2号组两条边,有50%的概率同时出现,50%的概率同时不出现。3号组两条边,有50%的概率出现第一条,有50%的概率出现第二条。问完美匹配(所有点都有匹配)方案数的期望*2^n。n<=15。
标程:
#include<cstdio>
#include<map>
using namespace std;
typedef long long ll;
const int mod=1e9+;
const int inv2=5e8+;
const int inv4=25e7+;
const int inv_4=75e7+;
const int N=;
int read()
{
int x=;char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (''<=ch&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
return x;
}
struct node{int v,p;node(){}node(int A,int B){v=A;p=B;}}e[N];
map<int,int> mp;
int n,m,op,x,y,cnt,id,id2;
int dp(int zt)
{
if (!zt) return ;
map<int,int>::iterator t=mp.find(zt);
if (t!=mp.end()) return t->second;
int ans=;
for (int i=;i<=cnt;i++)
if ((e[i].v&zt)==e[i].v&&e[i].v*>zt)
ans=((ll)ans+(ll)dp(zt^e[i].v)*e[i].p%mod)%mod;
return mp[zt]=ans;
}
int main()
{
n=read();m=read();
for (int i=;i<=m;i++)
{
op=read();x=read();y=read();
id=(<<x-)|(<<n+y-);
e[++cnt]=node(id,inv2);
if (op)
{
x=read(),y=read();
id2=(<<x-)|(<<n+y-);
e[++cnt]=node(id2,inv2);
if (!(id&id2))//有重合端点的话不用考虑
if (op==) e[++cnt]=node(id|id2,inv4);
else e[++cnt]=node(id|id2,inv_4);
}
}
printf("%d\n",((ll)dp((<<(*n))-)<<n)%mod);
return ;
}
易错点:1.注意2和3组的两条边如果有重复端点的话是不用考虑加组合边的,一定不会同时选这两条边。
题解:dp
如果都是1号组的点,也就是边没有依赖出现关系。那么直接dp。f[state]表示在state的匹配状态下完美匹配数的期望。
为了不算重,按照套路应该选取一个特殊点v,比如编号最大点、lowbit等。
f[state]=sigma(f[state^v^match_v]*p),p=50%,match_v表示与v相连的另一点。
状态数有sigma(C(n,i)^2)=sigma(C(n,i)*C(n,n-i))=范德蒙德卷积形式=C(2n,n)≈1.6*1e8,用map记录改成记忆化搜索就好了。
冷静分析第2组点和第3组点的特征:对于第2组点,如果两条边都不选或只选一条,概率则为0和50%和组1的情况一样;但当两条都选时,组1的概率为50%*50%=25%,而实际应该是50%,对策是再加一条包含这两条边的组合边,概率为25%,这样两种加起来就是50%了。
同理对于第3组点,如果都不选或只选一条,概率是等同于组1的选法。而都选的概率应该是0,于是加一条概率为-25%的组合边。
按照组1的情况转移即可。
loj2290 随机二分图的更多相关文章
- 【THUWC2017】随机二分图(动态规划)
[THUWC2017]随机二分图(动态规划) 题面 BZOJ 洛谷 题解 如果每天边的限制都是\(0.5\)的概率出现或者不出现的话,可以把边按照二分图左侧的点的编号排序,然后设\(f[i][S]\) ...
- 「THUWC 2017」随机二分图
「THUWC 2017」随机二分图 解题思路 : 首先有一个 \(40pts\) 的做法: 前 \(20pts\) 暴力枚举最终的匹配是怎样的,check一下计算方案数,后 \(20pts\) 令 \ ...
- [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\). 一条边出现了不代表它一定在完美匹配内,这也导致很难去直 ...
- bzoj5006: [THUWC2017 Bipartite]随机二分图
某人在玩一个非常神奇的游戏.这个游戏中有一个左右各 nnn 个点的二分图,图中的边会按照一定的规律随机出现. 为了描述这些规律,某人将这些边分到若干个组中.每条边或者不属于任何组 (这样的边一定不会出 ...
- @loj - 2290@ 「THUWC 2017」随机二分图
目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个左右各 n 个点的二分图,图中的边会按照一定的规律随机出现. ...
- [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] ...
随机推荐
- Android Canvas save和restoreToCount
@Override public void draw(Canvas canvas) { if (mDrawable!=null) { int sc=canvas.save(); if (mAnimat ...
- ionic-CSS:ionic icon(图标)
ylbtech-ionic-CSS:ionic icon(图标) 1.返回顶部 1. ionic icon(图标) ionic 也默认提供了许多的图标,大概有 700 多个,针对 Android 和 ...
- day27-面向对象进阶
#!/usr/bin/env python # -*- coding:utf-8 -*- # ----------------------------------------------------- ...
- 20140402 cmake编译错误原因 同时装了vs2010和vs2012
1.cmake编译错误原因 在用cmake编译opencv出现的错误 The CXX compiler identification is MSVC 16.0.30319.1 The C compil ...
- HDU 3308 线段树求区间最长连续上升子序列长度
题意:两种操作,Q L R查询L - R 的最长连续上升子序列长度,U pos val 单点修改值 #include <bits/stdc++.h> #define N 100005 us ...
- mysql实现访问审计
mysql的连接首先都是通过init_connect初始化,然后连接到实例. 我们利用这一点,通过在init_connect的时候记录下用户的thread_id,用户名和用户地址实现db的访问审计功能 ...
- IDEA与Tomcat的相关配置说明
1.IDEA会为每个Tomcat部署的项目单独建立一份配置文件 查看控制台的log输出:Using CATAINA_BASE 2.工作空间项目和Tomcat部署的web项目 WEB-INF:内的资源不 ...
- java oop遍历List和Map的几种方法
一.list的遍历 import java.util.*; public class ListTest { public static void main(String[] args) { List& ...
- Laravel 迁移检查表是否存在
Schema::hasTable('TableName'); //检查表释放存在 Schema::hasColumn('tableName', 'columeName'); //检查表是否存在某个字段 ...
- cocos2D-X LUA 非常简单的一个贪吃蛇案例
--[[ 贪吃蛇 ]] local RetroSnaker = class("RetroSnaker", function() return cc.Layer:create(); ...