1 条题解
-
0
E2. 数字村庄(困难版本)详细题解
1. 问题重述与约束变化
- 与 Easy Version 相比,n, m 最大可达 5000,且 ,。
- 因此 的算法可行, 不可行。
- 仍需要为每个 输出最小总延迟。
2. 问题转化(与 Easy Version 相同)
-
最小瓶颈路径:
两点间路径的最大边权的最小值 = 最小生成树(MST)上路径的最大边权。 -
Kruskal 重构树:
按边权升序构建重构树,叶子是原图顶点,内部节点权值 = 对应边权。
性质:原树中两点 路径的最大边权 = KRT 中 的权值。 -
设 为需要互联网的顶点集()。
$$\text{cost}(S) = \sum_{u \in P} \min_{s \in S} \text{maxEdge}(u,s) $$
选择服务器集合 (),则总延迟:其中 在 KRT 中等于 。
3. 关键观察:子树覆盖思想
在 KRT 中,考虑一个内部节点 (对应一条边权 ),它把树分成若干子树(KRT 是二叉树,但原 MST 是多叉树,KRT 将 MST 边转化为内部节点)。
实际上,KRT 中每个内部节点 代表原 MST 的一条边,它将原 MST 分成两个连通块。
设 的两个孩子子树为 和 ,其中包含的 中点数量分别为 和 。重要性质:
如果 和 中都有服务器,则 对应的边权 不会被任何 中点计入延迟(因为每个点可以连接到同侧的服务器,不跨过 )。
如果只有一侧有服务器,则另一侧的所有 点必须跨过 连接到对面,因此它们的延迟至少为 ,且这部分贡献恰好为 (另一侧的 点数)。
4. 动态规划设计(基于 KRT)
定义 = 在 KRT 的子树 中,放置恰好 个服务器,且子树 内部的所有 点都被覆盖时,这些 点的最小总延迟。
-
对于叶子节点 :
- 如果 :(放一个服务器,延迟 0),(不放服务器无法覆盖)。
- 如果 :,(放服务器不影响)。
-
对于内部节点 ,有两个孩子 和 ,边权 。
设 为子树内 点数量。
枚举 中放 个服务器, 中放 个,总 。
转移时需要考虑跨子树的贡献:- 如果 且 ,则 中的 个点必须跨过 连接到 的服务器,贡献 。
- 如果 且 ,则贡献 。
- 如果 且 ,则贡献 (两侧内部覆盖)。
- 如果 且 ,则无法覆盖(除非 ,但这种情况不需考虑)。
因此:
$$dp[u][t] = \min_{a+b=t} \left( dp[l][a] + dp[r][b] + w \cdot \text{cross}(a,b) \right) $$其中
$$\text{cross}(a,b) = \begin{cases} c_r & \text{if } a > 0, b = 0 \\ c_l & \text{if } a = 0, b > 0 \\ 0 & \text{if } a > 0, b > 0 \\ \infty & \text{if } a = 0, b = 0 \text{ 且 } c_l + c_r > 0 \end{cases} $$
5. 算法步骤
- 读入图,建 MST(Kruskal,)。
- 建 Kruskal 重构树()。
- 在 KRT 上树形 DP:
- 自底向上计算 = 子树内 点数。
- 对每个节点 , 是一个长度为 的数组( 可能为 )。
- 合并时使用卷积技巧,但这里 总和 ,直接 合并即可,总复杂度 。
- 答案:对于每个 ,,因为放多于 个服务器无意义(每个 点放一个即可)。
6. 时间复杂度分析
- 建 MST:
- 建 KRT:
- DP 合并:每个节点合并的复杂度为 ,且 $\sum c_l \cdot c_r \le \frac{(\sum c_u)^2}{2} \le O(p^2) \le O(n^2)$。
- 总复杂度 ,对于 可行。
7. 空间优化
- 只存长度为 的数组。
- 合并后释放子节点的数组。
- 总空间 约 个
long long,约 200MB,可能偏大。需要优化:- 使用
vector<ll>且及时释放。 - 或使用
short/int存储(但 ,乘积可能超 int,需long long)。 - 实际 时 也 ,最坏情况 ,此时 总和约 ,DP 总状态数 ,但每个状态只存一个
ll,约 = 200MB,加上递归开销可能接近极限。
可行方案:使用vector<long long>并只存必要状态,或采用分治 DP 减少内存。
- 使用
8. 优化内存的实现技巧
使用 DFS 后序,每次合并后立即释放子节点的
dp数组,这样任意时刻只有一条路径上的 dp 数组同时存在,总内存 ,最坏 但常数小很多。
9. 最终结论
该问题可通过 MST + Kruskal 重构树 + 树形背包 DP 在 时间和 空间内解决,适用于 的困难版本。
- 1
信息
- ID
- 6313
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者