abc253H

vjudge

给定一张 \(n\) 个点、初始为空的图,以及 \(m\) 条边。现在会执行 \(n - 1\) 次操作,每次操作随机挑选一条边,加入到图中。

请回答,对于 \(i = 1 \sim n - 1\)\(n - 1\) 次操作后图为森林的概率。

注意允许图中重边,此时认为不是森林。

\(n \le 14, m \le 500\),无自环。

先将概率转化为方案,求有多少种图,然后乘上 \(\frac{(i - 1)!}{m^i}\) 即可。

先考虑简单情况:一棵树。

看到 \(n \le 14\),不难想到状压 DP,令 \(f(S)\) 表示集合内的点经过 \(|S| - 1\) 次操作后,形成一棵树的方案数。

考虑转移,枚举一条边,把它断开就会形成两个集合 \(U, V\),不妨枚举 \(U\),算出有多少条边连接 \(U, V\) 内的点,则可以从 \(f(U)f(V)\) 转移过来。当然这样会算重,每个树会被每条边算两次,所以除掉 \(2(|S| - 1)\)。(其实可以使用矩阵树定理 \(O(n^3)\) 直接求出来)

计算有多少条边连接 \(U, V\) 内的点,可以 \(O(2^nn^2)\) 求出一个集合 \(S\) 内包含了 \(num_S\) 条边,那么就有 \(num_S - num_{U} - num_V\) 条边连接两个集合中的点。


再考虑森林,设 \(dp(i, S)\) 表示集合 \(S\) 形成森林,且进行了 \(i\) 次操作,则 \(dp(|S| - 1, S) = f(S)\)。转移时可以随便选定一个 \(x \in S\),枚举 \(x\) 所在的树进行转移:

\[dp(i, S) = \sum\limits_{T \subset S,T \ne \varnothing} dp(T)f(i - |S - T| + 1, T) \]

时间复杂度:\(O(2^nn^2 + n3^n)\)

从简单情况入手,使用状压 DP 解决树的问题,在用类似方式解决森林即可。

posted @ 2026-01-12 22:34  xiehanrui0817  阅读(4)  评论(0)    收藏  举报