1 条题解

  • 0
    @ 2026-4-30 20:45:39

    题意

    道路系统可以看作是一片森林。为了高效地存储各个连通分量,我们需要使用并查集(DSU)。首先,需要构建初始的道路系统。对于初始道路系统中的每个连通分量,我们必须求出该分量的直径。这可以通过 DFS 或 BFS 实现。

    aa 为分量中的任意一个顶点。
    bb 为距离顶点 aa 最远的顶点。
    cc 为距离顶点 bb 最远的顶点。
    直径等于 bbcc 的距离。这个求直径的算法只对树结构有效。
    对于并查集中的每个分量,我们记录其直径。

    思路

    现在处理第 11 类查询就非常简单了:找到顶点 xx 所属的分量,并输出该分量的直径。
    22 类查询也很容易处理:设 uu 为顶点 xx 所在的分量,vv 为顶点 yy 所在的分量。如果 uvu \neq v,则我们可以合并这两个分量。新分量的直径按如下方式计算:

    [ \text{new_diameter} = \max\left( \text{diameter}_u,\ \text{diameter}_v,\ \left\lceil \frac{\text{diameter}_u}{2} \right\rceil + \left\lceil \frac{\text{diameter}_v}{2} \right\rceil + 1 \right) ]

    算法步骤

    1. 读入初始道路信息,使用并查集维护连通分量。
    2. 对每个连通分量,任选一个顶点 aa,通过 DFS/BFS 找到距离 aa 最远的顶点 bb
    3. 再从 bb 出发,通过 DFS/BFS 找到距离 bb 最远的顶点 ccbbcc 的距离即为该分量的直径。
    4. 将直径信息保存在并查集的根节点中。
    5. 对于第 11 类查询,直接输出对应分量的直径。
    6. 对于第 22 类查询,若两个顶点不在同一分量,则按上述公式合并并更新直径。

    复杂度分析

    时间复杂度为 O(nα(n))O(n \cdot \alpha(n)),其中 α(n)\alpha(n) 是反阿克曼函数(inverse Ackermann function)。

    代码说明

    • 使用并查集(DSU)维护连通分量及其直径。
    • 使用两次 DFS/BFS 求树的直径。
    • 合并时按公式计算新直径,并更新并查集根节点信息。
    • 查询时直接通过并查集找到根节点并输出直径。
    • 1

    信息

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