1 条题解
-
0
题意
道路系统可以看作是一片森林。为了高效地存储各个连通分量,我们需要使用并查集(DSU)。首先,需要构建初始的道路系统。对于初始道路系统中的每个连通分量,我们必须求出该分量的直径。这可以通过 DFS 或 BFS 实现。
设 为分量中的任意一个顶点。
设 为距离顶点 最远的顶点。
设 为距离顶点 最远的顶点。
直径等于 到 的距离。这个求直径的算法只对树结构有效。
对于并查集中的每个分量,我们记录其直径。思路
现在处理第 类查询就非常简单了:找到顶点 所属的分量,并输出该分量的直径。
第 类查询也很容易处理:设 为顶点 所在的分量, 为顶点 所在的分量。如果 ,则我们可以合并这两个分量。新分量的直径按如下方式计算:[ \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) ]
算法步骤
- 读入初始道路信息,使用并查集维护连通分量。
- 对每个连通分量,任选一个顶点 ,通过 DFS/BFS 找到距离 最远的顶点 。
- 再从 出发,通过 DFS/BFS 找到距离 最远的顶点 , 到 的距离即为该分量的直径。
- 将直径信息保存在并查集的根节点中。
- 对于第 类查询,直接输出对应分量的直径。
- 对于第 类查询,若两个顶点不在同一分量,则按上述公式合并并更新直径。
复杂度分析
时间复杂度为 ,其中 是反阿克曼函数(inverse Ackermann function)。
代码说明
- 使用并查集(DSU)维护连通分量及其直径。
- 使用两次 DFS/BFS 求树的直径。
- 合并时按公式计算新直径,并更新并查集根节点信息。
- 查询时直接通过并查集找到根节点并输出直径。
- 1
信息
- ID
- 6727
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者