1 条题解
-
0
宽广图 题解
思路
记原树中顶点 的离心率为
先考虑阈值为 的新图。若 ,则 到任意其他顶点的距离都小于 ,所以它在新图中是孤立点。
反过来,树中离心率至少为 的所有顶点会处在同一个连通块中。取树直径的两个端点 。对任意顶点 ,都有
$$e(v)=\max(\operatorname{dist}(v,A),\operatorname{dist}(v,B)).$$若 ,则 至少与 中的一个相距不少于 。当树的直径不少于 时, 与 之间也有边,因此这些非孤立点通过直径端点连成一个连通块。
于是,当 不超过树的直径时,答案等于离心率小于 的顶点数再加一;当 大于直径时,所有顶点都是孤立点,答案为 。
这一结论给出了三种真实的算法层级。
做法
子任务 1 可以从每个顶点进行一次搜索,得到任意两点距离。随后对每个 显式枚举点对,在距离不少于 时用并查集合并,直接数连通块。
子任务 2 仍从每个顶点进行一次搜索,求出每个顶点的离心率。把离心率排序或计数,即可依次得到离心率小于各个 的顶点数。
完整做法只需三次树上搜索。先从任意点出发找到最远点 ,再从 出发找到最远点 ,则 是一对直径端点。分别求出所有顶点到 的距离,其较大值就是该顶点的离心率。统计每种离心率的出现次数并做前缀累加,即可输出所有答案。
复杂度
子任务 1 的时间复杂度为 ,空间复杂度为 。
子任务 2 的时间复杂度为 ,空间复杂度为 。
完整做法的时间复杂度为 ,空间复杂度为 。
- 1
信息
- ID
- 1154
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者