期望好题。

发现 \(n\) 非常小,应该要想到状压的。

我们可以先只考虑 0 操作。

最难的还是状态:

我们用 \(S\) 表示左部点有哪些点已经有对应点, \(T\) 表示右部点有哪些点已经有对应点,\(f[S][T]\) 表示从一条边没连到此状态的期望方案数

这样就有转移:

\[f[S][T] <- \sum_{s \in S,t \in T}f[S \oplus s][T \oplus t] * p(s, t)
\]

也就是说,从没选的点中选俩点连边。不过这可能会算重(先连 \(e_1\) 后连 \(e_2\) 和先连 \(e_2\) 后连 \(e_1\) 都会计入答案)。因此我们强制要求选择 \(S\) 中编号最小的点连边,这样每种答案就只被计算一次了。

然后考虑 1,2 操作。1,2 操作并没有改变两条边各自出现的概率,只是改变的两条边同时出现的概率。因此我们可以加一些特殊的边 \(e_1, e_2\) ,并要求 \(e_1, e_2\) 必须一起被选,这样就可以调节同时出现的期望。具体来说就是 1 操作加 \(\frac{1}{4}\),2操作减 \(\frac{1}{4}\)。

然后就没啥难点了。考虑到合法状态数不多,直接记忆化搜索即可。

const int P = 1e9 + 7;
inline ll quickpow(ll x, int k) {
ll res = 1;
while (k) {
if (k & 1) res = res * x % P;
x = x * x % P;
k >>= 1;
}
return res;
}
int inv2, inv4;
int n, m;
struct edge {
int s, t, p;
}e[N];
int ecnt; map<int, ll> mp[NN];
inline ll dfs(int S, int T) {
if (S == 0 && T == 0) return 1;
if (mp[S].count(T)) return mp[S][T];
ll res = 0;
for (register int i = 1; i <= ecnt; ++i) {
int s = e[i].s, t = e[i].t, p = e[i].p;
if (((S | s) != S) || ((T | t) != T)) continue;
if ((s | (lowbit(S))) != s) continue;
res = (res + dfs(S ^ s, T ^ t) * p) % P;
}
mp[S][T] = res;
return res;
} int main() {
inv2 = quickpow(2, P - 2);
inv4 = quickpow(4, P - 2);
read(n), read(m);
for (register int i = 1; i <= m; ++i) {
int t, x, y; read(t), read(x), read(y);
--x, --y;
e[++ecnt] = (edge){1 << x, 1 << y, inv2};
if (t) {
int a, b; read(a), read(b);
--a, --b;
e[++ecnt] = (edge){(1 << a), (1 << b), inv2};//Attention!
if (a == x || b == y) continue;
e[++ecnt] = (edge){(1 << x) | (1 << a), (1 << y) | (1 << b), t == 1 ? inv4 : P - inv4};
}
}
ll ans = dfs((1 << n) - 1, (1 << n) - 1) * (1 << n) % P;
printf("%lld\n", ans);
return 0;
}

P4547 [THUWC2017]随机二分图(状压,期望DP)的更多相关文章

  1. CF16E Fish(状压+期望dp)

    [传送门[(https://www.luogu.org/problemnew/show/CF16E) 解题思路 比较简单的状压+期望.设\(f[S]\)表示\(S\)这个状态的期望,转移时挑两条活着的 ...

  2. 【BZOJ3925】[ZJOI2015] 地震后的幻想乡(状压期望DP)

    点此看题面 大致题意: 有\(n\)个点和\(m\)条边,每条边的权值是一个\(0\sim1\)的随机实数,要你用\(n-1\)条边将图联通,问这\(n-1\)条边中边权最大值的期望最小值. 提示 这 ...

  3. uva11600 状压期望dp

    一般的期望dp是, dp[i] = dp[j] * p[j] + 1; 即走到下一步需要1的时间,然后加上 下一步走到目标的期望*这一步走到下一步的概率 这一题,我们将联通分块缩为一个点,因为联通块都 ...

  4. BZOJ5006 THUWC2017随机二分图(概率期望+状压dp)

    下称0类为单边,1类为互生边,2类为互斥边.对于一种匹配方案,考虑其出现的概率*2n后对答案的贡献,初始为1,如果有互斥边显然变为0,否则每有一对互生边其贡献*2.于是有一个显然的dp,即设f[S1] ...

  5. 洛谷 P4547 & bzoj 5006 随机二分图 —— 状压DP+期望

    题目:https://www.luogu.org/problemnew/show/P4547 https://www.lydsy.com/JudgeOnline/problem.php?id=5006 ...

  6. bzoj 1076 奖励关 状压+期望dp

    因为每次选择都是有后效性的,直接dp肯定不行,所以需要逆推. f[i][j]表示从第i次开始,初始状态为j的期望收益 #include<cstdio> #include<cstrin ...

  7. BZOJ 1076 奖励关(状压期望DP)

    当前得分期望=(上一轮得分期望+这一轮得分)/m dp[i,j]:第i轮拿的物品方案为j的最优得分期望 如果我们正着去做,会出现从不合法状态(比如前i个根本无法达到j这种方案),所以从后向前推 如果当 ...

  8. HDU 4336 Card Collector:状压 + 期望dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题意: 有n种卡片(n <= 20). 对于每一包方便面,里面有卡片i的概率为p[i],可 ...

  9. [思路题][LOJ2290][THUWC2017]随机二分图:状压DP+期望DP

    分析 考虑状压DP,令\(f[sta]\)表示已匹配状态是\(sta\)(\(0\)代表已匹配)时完美匹配的期望数量,显然\(f[0]=1\). 一条边出现了不代表它一定在完美匹配内,这也导致很难去直 ...

随机推荐

  1. JavaWeb网上图书商城完整项目-数据库操作工具类

    1.首先安装数据库,在windows上安装和在unix上面安装环境不一样,我在自己的本地电脑上安装,安装成功之后,如果使用navicat远程工具访问,需要允许mysql远程能被访问 方法二.直接授权( ...

  2. SpringMVC 学习笔记(四)

    41. 尚硅谷_佟刚_SpringMVC_返回JSON.avi SpringMVC中使用@ResponseBody注解标注业务方法,将业务方法的返回值做成json输出给页面 导包: 除了一些sprin ...

  3. springboot自动装配原理

    最近开始学习spring源码,看各种文章的时候看到了springboot自动装配实现原理.用自己的话简单概括下. 首先打开一个基本的springboot项目,点进去@SpringBootApplica ...

  4. SQLSTATE[42000]: Syntax error or access violation: 1253 COLLATION 'utf8mb4_unicode_ci' is not valid for CHARACTER SET 'binary'

    SQLSTATE[42000]: Syntax error or access violation: 1253 COLLATION 'utf8mb4_unicode_ci' is not valid ...

  5. Alink漫谈(八) : 二分类评估 AUC、K-S、PRC、Precision、Recall、LiftChart 如何实现

    Alink漫谈(八) : 二分类评估 AUC.K-S.PRC.Precision.Recall.LiftChart 如何实现 目录 Alink漫谈(八) : 二分类评估 AUC.K-S.PRC.Pre ...

  6. Idea集成git常用命令

    git status --查看文件状态   untracked: 未跟踪 一般为新增文件  git add 状态改为staged git add +文件 git add -A +路径  修改过的未被跟 ...

  7. 洛谷 P4017 【最大食物链计数】

    看到这种明显的有向无环图,并且等级分明,自然而然就能想到拓补排序啦.对于这道题,我们就可以利用最短路计数的那种思想(不知道也没关系),设\(j\)是\(i\)的后继,\(dis_i\)表示以\(i\) ...

  8. Python3笔记008 - 2.5 运算符

    第2章 python语言基础 运算符:是一些特殊的符号,主要用于数学计算等. 表达式:使用运算符将不同类型的数据按照一定的规则连接起来的式子. 分类:算术运算符.赋值运算符.比较运算符.逻辑运算符.位 ...

  9. 图片文件分布式存储方案设计模式(c#--sqlserver)

    1.为了降低web服务器的压力,申请了2台文件服务器,用来存放图片文件.但是两台文件服务器如何让程序自己选择呢? 于是我用了一个算法,思路如下: 从状态表筛选出可用的图片服务器集合记作C,并获取集合的 ...

  10. 「STL中的常用函数 容器」

    占个坑,下午在更 二分操作:lower_bound和upper_bound 存图/数列操作:vector容器 全排列:next_permutation和prev_permutation 字符串转数列: ...