1 条题解

  • 0
    @ 2026-8-30 10:54:13

    宽广图 题解

    思路

    记原树中顶点 vv 的离心率为

    e(v)=max⁡udist⁡(u,v).e(v)=\max_u \operatorname{dist}(u,v).

    先考虑阈值为 kk 的新图。若 e(v)<ke(v)<k,则 vv 到任意其他顶点的距离都小于 kk,所以它在新图中是孤立点。

    反过来,树中离心率至少为 kk 的所有顶点会处在同一个连通块中。取树直径的两个端点 A,BA,B。对任意顶点 vv,都有

    $$e(v)=\max(\operatorname{dist}(v,A),\operatorname{dist}(v,B)).$$

    若 e(v)≥ke(v)\ge k,则 vv 至少与 A,BA,B 中的一个相距不少于 kk。当树的直径不少于 kk 时,AA 与 BB 之间也有边,因此这些非孤立点通过直径端点连成一个连通块。

    于是,当 kk 不超过树的直径时,答案等于离心率小于 kk 的顶点数再加一;当 kk 大于直径时,所有顶点都是孤立点,答案为 nn。

    这一结论给出了三种真实的算法层级。

    做法

    子任务 1 可以从每个顶点进行一次搜索,得到任意两点距离。随后对每个 kk 显式枚举点对,在距离不少于 kk 时用并查集合并,直接数连通块。

    子任务 2 仍从每个顶点进行一次搜索,求出每个顶点的离心率。把离心率排序或计数,即可依次得到离心率小于各个 kk 的顶点数。

    完整做法只需三次树上搜索。先从任意点出发找到最远点 AA,再从 AA 出发找到最远点 BB,则 A,BA,B 是一对直径端点。分别求出所有顶点到 A,BA,B 的距离,其较大值就是该顶点的离心率。统计每种离心率的出现次数并做前缀累加,即可输出所有答案。

    复杂度

    子任务 1 的时间复杂度为 O(n3)O(n^3),空间复杂度为 O(n2)O(n^2)。

    子任务 2 的时间复杂度为 O(n2)O(n^2),空间复杂度为 O(n)O(n)。

    完整做法的时间复杂度为 O(n)O(n),空间复杂度为 O(n)O(n)。

    • 1

    信息

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