期望好题。

发现 \(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;
}

最新文章

  1. 《转》Unity3D研究院之UGUI一个优化效率小技巧
  2. Web报表工具FineReport的JS API开发(二)
  3. [转]sed命令详解
  4. C# 获取系统时间及时间格式
  5. UNIX 和 LINUX
  6. wpf RadioButton控件的一个bug,onpropertychanged后会修改旧属性的值
  7. [置顶] 第二届微软CRM交流年会
  8. 搬寝室(HDU 1421 DP)
  9. WPF中获取控件之间的相对位置
  10. ListBox 如何改变某行的字体颜色
  11. 关于下载SAE日志签名认证的方法——PHP版
  12. 全易通人事考勤工资验厂管理系统软件创建连接SQL2000数据库的操作方法和说明
  13. python版mapreduce题目实现寻找共同好友
  14. 【Java学习笔记之四】java进制转化
  15. 从0开始的Python学习015输入与输出
  16. JavaLinkedHashSet练习
  17. CSS 隐藏页面元素的 几 种方法总结
  18. Flask学习-Flask app启动过程
  19. GDOI2018 Day1 题目总结
  20. 基于qml创建最简单的图像处理程序(2)-使用c++&amp;qml进行图像处理

热门文章

  1. 一起玩转微服务(10)——spring boot介绍
  2. Perl如何安装新模块/包
  3. 黎活明8天快速掌握android视频教程--23_网络通信之网络图片查看器
  4. 01.scrapy入门
  5. 14 张思维导图构建 Python 核心知识体系
  6. django项目常见报错集
  7. JAVA7新属性之放宽switch的使用限制
  8. Ocelot网关+IdentityServer4实现API权限认证
  9. Python OpenCV的绘图功能简介
  10. 通过源码学习@functools.lru_cache