CodeForces 1229 E Marek and Matching

题目大意:

\(2n\) 个点,其中有 \(n\) 个左边的点,有 \(n\) 个右边的点,他们之间有 \(n^2\) 条边。
每条边都有断的概率,请问断完后有完美匹配的概率是多少。
\(ans \mod 10^ 9 + 7\)
\(n \le 7\)

解题思路:

首先求完备匹配无非就是几种做法:

  1. flow
  2. Hall定理
  3. 状压,具体是设 \(f_{i, S}\) 表示前 \(i\) 个,与 \(S\) 匹配成不成立。

其次此题要求计数。

  1. flow 能计数吗?感觉不是那么好做。
  2. Hall 定理和状压感觉能做。

但 Hall 定理有个劣势,就是说你得记录前面所有集合与他有连边。
记录的太多了。
所以选择状压。
具体的,状压的转移方程是:

\[f_{i + 1, S \cup j} |= f_{i, S} and g_{i, j} \]

那么由于要记录方案数,所以考虑 dp of dp。
\(dp_{i, S'}\) 表示将 \(f\) 中的状态压缩之后是 \(S'\) 的方案数。
考虑 \(f\) 的定义,由于只有 \(\binom{n}{i}\) 种,所以复杂度是 \(O(n^2 \times 2^{\binom{n}{i}})\) 的,状态是 \(O(n \times 2^{\binom{n}{i}})\),转移是 \(O(n)\) 的。
就可以过 \(E1\)
然后我们发现状态数不是很多。
所以记忆化一下就能过 \(n \le 7\)
转移的时候可以在最前面预处理出 \(h_{i, S}\) 表示 \(i\)\(S\) 内的点连边,与不在 \(S\) 内的点不连边的概率。
然后再预处理出对于下一个点要连的边的集合 \(S\),他的下一步的状态是什么即可。

posted @ 2025-03-16 00:16  positive_deviation  阅读(34)  评论(0)    收藏  举报