1 条题解

  • 0
    @ 2025-10-19 22:10:22

    题目分析

    我们要求的是最优翻修方案的不便利值,即: [ \min_{\text{翻修方案}} \sum_{\text{乡村 } i} c_i \cdot (a_i + x_i) \cdot (b_i + y_i) ] 其中 xix_i 是从乡村 ii 到首都路径上未翻修的公路数,yiy_i 是未翻修的铁路数。

    问题转化

    这是一个树形动态规划问题。对于每个城市,我们需要选择翻修公路还是铁路,这个选择会影响所有经过该城市的乡村的不便利值。

    树形DP思路

    由于树的结构特殊(从乡村到首都的路径唯一,且每个城市恰好有两条入边),我们可以用树形DP来解决。

    状态定义

    dp[u][i][j]dp[u][i][j] 表示在节点 uu 的子树中,从 uu 到根节点路径上已经有 ii 条未翻修公路、jj 条未翻修铁路时,该子树的最小总不便利值。

    状态转移

    对于叶子节点(乡村): 如果 uu 是乡村,其参数为 (au,bu,cu)(a_u, b_u, c_u),则: [ dp[u][i][j] = c_u \cdot (a_u + i) \cdot (b_u + j) ]

    对于城市节点: 设城市 uu 的公路起点是 v1v_1,铁路起点是 v2v_2

    • 情况1:翻修公路 公路变为已翻修,铁路未翻修: [ \text{cost}_{\text{road}} = dp[v_1][i][j] + dp[v_2][i][j+1] ]

    • 情况2:翻修铁路 铁路变为已翻修,公路未翻修: [ \text{cost}_{\text{rail}} = dp[v_1][i+1][j] + dp[v_2][i][j] ]

    取最小值: [ dp[u][i][j] = \min(\text{cost}{\text{road}}, \text{cost}{\text{rail}}) ]

    算法流程

    1. 建立树结构,记录每个城市的公路和铁路起点
    2. 从叶子节点(乡村)开始向上DP计算
    3. 对于乡村节点,直接计算不便利值
    4. 对于城市节点,根据翻修选择计算最小代价
    5. 最终答案:dp[1][0][0]dp[1][0][0](根节点没有未翻修道路)

    优化策略

    由于 n20000n \leq 20000,直接开三维数组 dp[20000][40][40]dp[20000][40][40] 会超内存。实际实现时可以采用:

    • 记忆化搜索:只计算实际会出现的状态
    • map存储:用 map<pair<int,int>, long long>\text{map<pair<int,int>, long long>} 存储每个节点的状态
    • 范围限制:利用题目条件 ai,bi60a_i, b_i \leq 60 和路径长度 40\leq 40,将 i,ji,j 范围限制在 01000 \sim 100

    时间复杂度

    每个节点的状态数最多为 100×100=10000100 \times 100 = 10000,总时间复杂度 O(n×10000)O(n \times 10000),经过优化后可以通过。

    样例验证

    以样例1为例:

    • 翻修通往城市 22 和城市 55 的铁路,以及其他城市的公路
    • 计算得到总不便利值为 5454
    • 与题目输出一致

    总结

    本题的关键在于:

    • 将翻修选择转化为树形DP决策
    • 设计包含路径上未翻修道路数量的状态
    • 利用树的结构进行自底向上的计算
    • 通过状态优化控制复杂度

    这种方法可以高效求出最小不便利值,时间复杂度为 O(nM2)O(n \cdot M^2),其中 MM 是状态范围(约100)。

    • 1

    信息

    ID
    3532
    时间
    3000ms
    内存
    512MiB
    难度
    8
    标签
    递交数
    22
    已通过
    1
    上传者