小 T 打算在城市 C 开设一家外送快餐店。送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小 T 希望快餐店的地址选在离最远的顾客距离最近的地方。
快餐店的顾客分布在城市 C 的 个建筑中,这 个建筑通过恰好 条双向道路连接起来,不存在任何两条道路连接了相同的两个建筑。任意两个建筑之间至少存在一条由双向道路连接而成的路径。小 T 的快餐店可以开设在任一建筑中,也可以开设在任意一条道路的某个位置上(该位置与道路两端的建筑的距离不一定是整数)。
现给定城市 C 的地图(道路分布及其长度),请找出最佳的快餐店选址,输出其与最远的顾客之间的距离。
Constraints
Solution
题目给出的图为一棵基环树。对于普通的树的情况,答案即为直径的 。而对于基环树来说,答案有两种情况,经过环和不经过环。
对于不经过环的部分,我们可以直接树形 dp 求解。而对于经过环的部分,观察可得,一定有一条边没有经过,破环成链之后对应的就是一个区间。我们令 为以 为端点且另一个端点位于 的子树中的最长链的长度,令 表示破环成链后序列上 和 的距离,则最长链为 。令 表示序列上到 的距离前缀和,则 ,则最长链为 。对于一个区间,我们分别求出 和 的最大值即可。因为最大值有可能位于同一个位置,所以还需要维护次大值。在这里我们使用线段树进行维护。
关于统计答案时,序列上 的位置一定在 前面的证明,详见 《【树DP+基环树】[NOI2013]快餐店》 。
Code
1 |
|