本题要求在一棵树上切断至多 k 条枝条,使得所有连通块的冠幅(即块内任意两点最短路径长度的最大值,也称直径)的最大值尽量小。这是一个典型的最小化最大值问题,可以使用二分答案来求解。
parent、与父节点相连的枝条长度 pw、子节点列表 children 以及后序遍历序列 post。up[u] 表示在以 u 为根的当前连通块中,从 u 向下延伸的最长路径长度。一棵古老的银杏树有 n 个分叉点,编号 1 到 n,并由 n−1 条枝条连接成一棵树。第 i 条枝条连接分叉点 ui 与 vi,长度为 wi。园艺师可以锯掉至多 k 条枝条,将树分割成若干个独立的连通部分。对任意一个部分,定义其 冠幅 为部分内任意两个分叉点之间沿枝条的最长距离(即最短路径长度的最大值)。园艺师希望在最多锯掉 k 条枝条的条件下,使得所有部分的冠幅的最大值尽可能小。请计算这个最小的最大值。
约束:分叉点数量 n 满足 2≤n≤2×105,可锯枝条上限 k 满足 0≤k≤n−1,枝条长度 wi 为不超过 109 的正整数。输入保证所有枝条构成一棵连通无环的树。
第一行包含两个整数 n 和 k,分别表示分叉点数量与最多可锯掉的枝条数。 接下来 n−1 行,每行包含三个整数 ui,vi,wi,表示一条连接分叉点 ui 与 vi 且长度为 wi 的枝条。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.