1 条题解

  • 0
    @ 2025-11-10 21:59:14

    题解

    发射器 题解

    问题分析

    我们有一棵 nn 个节点的树,需要在节点上放置发射器,使得每条边 (u,v)(u,v) 满足:

    1. uuvv 有发射器,或者
    2. uuvv 的邻居中(包括自身)至少有 2 个发射器

    这是一个树上的覆盖问题,类似于最小支配集但条件更复杂。

    关键观察

    覆盖条件分析

    对于边 (u,v)(u,v)

    • 条件1:uuvv 有发射器(直接覆盖)
    • 条件2:uu 的邻居中有 ≥2 个发射器,或 vv 的邻居中有 ≥2 个发射器

    条件2意味着:如果某个节点没有发射器,但它的两个邻居有发射器,那么与它相连的边也能被覆盖。

    算法思路

    树形动态规划

    dp[u][state]dp[u][state] 表示以 uu 为根的子树所需的最小发射器数量,其中 statestate 表示 uu 的状态和约束。

    状态设计

    对于每个节点 uu,我们关心:

    • uu 本身是否有发射器
    • uu 的父节点是否有发射器
    • uu 的覆盖状态

    更精细的状态设计: 令 dp[u][c]dp[u][c] 表示节点 uu 的状态为 cc 时,子树 uu 的最小发射器数,其中 c{0,1,2,3}c \in \{0,1,2,3\}

    • 状态 0: uu 没有发射器,且 uu 未被覆盖(需要子节点或父节点提供覆盖)
    • 状态 1: uu 没有发射器,但 uu 已被覆盖(邻居有发射器)
    • 状态 2: uu 有 1 个发射器
    • 状态 3: uu 有 ≥2 个发射器

    状态转移

    对于节点 uu 和其子节点 v1,v2,...,vkv_1, v_2, ..., v_k

    1. uu 状态 0(无发射器,未覆盖):

      • 需要至少一个子节点状态为 2 或 3(提供覆盖)
      • 其他子节点可以是状态 1,2,3
    2. uu 状态 1(无发射器,已覆盖):

      • 需要至少两个子节点状态为 2 或 3,或者一个子节点状态为 3
      • 其他子节点可以是状态 1,2,3
    3. uu 状态 2(1个发射器):

      • 子节点可以是任意状态(因为 uu 的发射器能覆盖相邻边)
    4. uu 状态 3(≥2个发射器):

      • 子节点可以是任意状态

    具体转移时,需要对子节点的状态组合进行背包DP。

    复杂度分析

    • 时间复杂度O(n)O(n),每个节点处理一次
    • 空间复杂度O(n)O(n),存储DP状态

    算法正确性

    该DP状态设计考虑了所有覆盖情况:

    • 状态0确保需要子节点提供覆盖
    • 状态1确保满足"两个邻居有发射器"的条件
    • 状态2和3直接提供覆盖能力

    样例验证

    样例1

    输入:
    7
    1 2
    2 3  
    2 4
    4 5
    5 6
    6 7
    输出:2
    

    验证:在节点2和6各放1个发射器,总数为2。

    样例2

    输入:
    7  
    1 2
    2 3
    4 3
    5 4
    6 3
    7 6
    输出:2
    

    验证:在节点3放2个发射器,总数为2。

    总结

    本题是树形DP的经典应用,通过精细的状态设计处理复杂的覆盖条件。关键在于理解覆盖条件的本质并设计合适的状态表示。

    最终算法标签树形DP 最小覆盖 状态压缩 DFS

    • 1

    信息

    ID
    5170
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者