期望好题。

发现 \(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. Accelerate Framework in Swift

    介绍: 最近看到这篇文章有对Accelerate框架有一个介绍,自己也按照作者给的思路整理了一遍,也算是对这一框架的一个重新的回顾和学习,在以前研究AR先关只是的时候有接触到这个框架,赞具体里面的东西 ...

  2. 处理TortoiseGit一直弹出密码框的方法 -输入git@XXXX.com的密码

    问题 :在push和pull的时候,一直都弹出这个框 1.开始处搜索TortoiseGit文件夹,找到其中的“PuTTYgen”文件,如下显示 2.运行之后在弹出的窗口中点击下方的“Generate” ...

  3. java SSM框架单元测试最佳实战代码

    具体的代码参考链接:https://pan.baidu.com/s/1e9UTyidi4OMBwYydhwH-0g 密码:rmvs 本教程采用的是对单元测试的dao层.service层.control ...

  4. 网络编程 套接字socket TCP UDP

    网络编程与套接字 网络编程 网络编程是什么: ​ 网络通常指的是计算机中的互联网,是由多台计算机通过网线或其他媒介相互链接组成的 ​ 编写基于网络的应用程序的过程序称之为网络编程. 网络编程最主要的工 ...

  5. 四层发现-UDP发现

    udp发现要注意选择一个不常用的端口,如果目标ip在up时目标端口是开放状态,那么不管目标ip是否为up状态,都不会收到任何回应,只有在目标ip为down状态且目标端口为关闭状态,才会返回一个目标不可 ...

  6. 如何下载 Ubuntu 镜像文件?

    Ubuntu,是一款基于 Debian Linux 的以桌面应用为主的操作系统,内容涵盖文字处理.电子邮件.软件开发工具和 Web 服务等,可供用户免费下载.使用和分享. 但是对于国内的用户来说如果直 ...

  7. plsql启动报 Using filter for all users can lead to poor perform

    首先,这个与Oracle配置无关,就是在使用pl/sql左侧树形目录时会看到非常多的和你当前工作无关的表,视图,序列等,导致打开速度慢. ​解决办法:Tools-->Object browser ...

  8. BootstrapDialog.show - 提示信息对话框

    外文资料:http://nakupanda.github.io/bootstrap3-dialog/ (1)最简单的实现方式: BootstrapDialog.show({ message: 'Hi ...

  9. IntelliJ IDEA快速实现Docker镜像部署

    一.Docker开启远程访问 [root@izwz9eftauv7x69f5jvi96z docker]# vim /usr/lib/systemd/system/docker.service #修改 ...

  10. Kubernetes实战总结 - Ingress选型与应用

    一.概述 Ingress 是对集群中服务的外部访问进行管理的 API 对象,可以提供负载均衡.SSL 终结和基于名称的虚拟托管. 典型的访问方式是 HTTP,用于将不同URL的访问请求转发到后端不同的 ...