1 条题解
-
0
题解
算法分析
本题是一个基于 最小生成树 和 概率期望 的问题,使用 状态压缩动态规划 和 容斥原理 来计算期望值。
问题本质
我们需要计算在 条边中选出 条边构成生成树,并且这些边的修复时间(独立均匀分布在 )的最大值的期望。
核心思路
-
利用提示公式:对于 个 均匀分布随机变量,第 小的期望为 。因此最大值的期望为 。
-
关键转化:如果知道在所有大小为 的边集中,恰好有 个边集能构成生成树,那么总期望为:
$$E = \sum_{k} \frac{k}{m+1} \times \frac{\text{大小为 }n-1\text{ 且能构成生成树的边集个数}}{\binom{m}{n-1}} $$但实际需要更精细的计数。
-
状态压缩DP:
- 状态 :表示点集
- :在点集 中,选择 条边,且这些边不构成/构成连通图的方案数
- 使用容斥:连通图数 = 所有图数 - 不连通图数
-
转移方法:
- 固定包含最小标号点的连通分量
- 用 (连通)乘以剩余部分 中任意选 条边的方案数
算法标签
- 状态压缩动态规划
- 容斥原理
- 图计数
- 概率期望
- 最小生成树
关键代码解析
// 预处理组合数 rep1(i, 0, m) { c[i][0] = 1; rep1(j, 1, i) c[i][j] = c[i-1][j-1] + c[i-1][j]; } // 计算每个点集内的边数 rep1(i, 1, m) { auto [u, v] = e[i]; rep1(S, 1, lmt) if ((S>>u-1&1) && (S>>v-1&1)) ++ecnt[S]; } // 状态压缩DP rep1(S, 0, lmt) rep1(i, 0, ecnt[S]) { g[S][i][0] = 0; // 枚举包含最小点的连通分量T for(int T = S&(S-1); T; T = S&(T-1)) { if(T & (S&-S)) { // 包含最小点 rep1(j, 0, ecnt[T]) { // 容斥转移 g[S][i][0] += g[T][j][1] * c[ecnt[S^T]][i-j]; } } } g[S][i][1] = c[ecnt[S]][i] - g[S][i][0]; } // 计算最终期望 ld ans = 0; rep1(i, 0, m-1) ans += 1.0 * g[lmt][i][0] / c[m][i]; ans /= m + 1;时间复杂度
- 状态数:
- 每个状态枚举子集:
- 边数枚举:
- 总体复杂度:,在 时可接受
空间复杂度
- ,用于存储 DP 状态
算法正确性
- 通过容斥准确计算了每个点集的连通子图数量
- 利用概率论公式将连通图计数转化为期望计算
- 状态压缩确保所有子集情况都被考虑
总结
本题结合了图论、组合数学和概率论,通过状态压缩DP和容斥原理解决了生成树期望问题。关键在于将概率期望转化为图计数问题,并使用DP高效计算所有可能的连通情况。
-
- 1
信息
- ID
- 5494
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者