luogu3761 [TJOI2017]城市

题目

  luogu3761

题解

  显然,只有在原树直径上删边,才可能使新树的直径变小,于是枚举直径上每条边

  算了直径复杂度也是O(n)级的,干脆直接暴力枚举所有的边

  删边后原树被分成 l, r 两颗子树,组成的新树直径有三种可能

  1. 新树的直径为子树 l 的直径

  2. 新树的直径为子树 r 的直径

  3. 设新连的边的两端点分别为 lx, rx,dis(lx/rx) 分别为 lx/rx 到子树 l/r 最远点的距离,新树的直径为 dis(lx) + dis(rx) + w(删除边的边权)

  新树的直径即为三种情况取 max

  子树 l, r 的直径可以两边bfs求得,就不多加阐述了

  对于第三种情况,首先要找到连新边的端点 lx, rx

  显然,要使 lx 到最远点的距离最短,lx 必然在树 l 的直径上,由反证法可得

  暴力枚举直径上所有点

代码

  

猜你喜欢

转载自www.cnblogs.com/XYZinc/p/9179384.html
今日推荐