题意
给定1棵无根树,树边有正边权。
点路距\(D(u,F)\):最小化点点距
偏心距\(ECC(F)\):最大化点路距
现在限制\(F\)属于原树直径,且\(F\)的长度小于等于\(s\),求最小化偏心距。
对于\(30\)%的数据,\(5 \leq n \leq 300\)
对于\(100\)%的数据,\(5 \leq n \leq 5 \times 10^5\)
题解
这是什么神仙毒瘤题!
暴力选手:
限制\(F\)属于原树直径?原树直径这么多条,难道逐一找出再做?
干脆直接枚举\(F\)的两端点,并将\(F\)上节点标记为不可访问。从两端点进行\(DFS\)求得最长距离即可判定能否得到直径。若能得到直径,则求偏心距。
偏心距是最大的点路距,而点路距的本质是该点到该路径上,既不经过重复的边也不经过该路径上的边,故可以转化成从该路径上的节点向外\(DFS\)得到。时间复杂度:\(O(n^3)\)。
优秀选手:
原树直径有多条不好做?我先来大胆猜想一发,考虑任意一条直径都是等价的。
证明?读者自证不难。
性质1,1棵树中,任意两条直径都是相交的
假设两条直径不相交,一定存在某条简单路径将两条直径连起来。形如此:
选择其中最长的两条分链加上用于连接的简单路径,会得到一条更长的直径,与假设矛盾。
性质2,各条直径在不相交的两端,长度分别相等(感谢::Dash::)
考虑两条直径AB和CD,它们的重叠部分为EF。
直径最长,新的组合长度不能超过直径长度。因此\(DF = BF,AE = EC\)。
推论:在任意一条直径上求最小偏心距都是等价的
偏心距的定义为所有点到已选定路径的距离最大值。本质上是路径上各点到非路径上各点的距离最大值。
根据直径的最长性,偏心距为路径上的点到直径端点的距离的最大值。
当选取的路径不包含公共部分时,偏心距即为该路径所在的直径端点到该路径端点距离的较大值。举个栗子,若在\(AE\)上取点\(P,Q\),则偏心距为\(BQ > BF\);若在\(BF\)上取点\(P,Q\),则偏心距为\(AP > AE\)。
当选取的路径包含公共部分时,举个栗子,\(CE\)上取点\(P\),\(DF\)上取点\(Q\),那么偏心距为\(max(AE,BF)\)。同理,在\(AE\)上取点\(P\),\(BF\)上取点\(Q\)时,偏心距为\(max(CE,DF)\)。根据\(AE = CE\)且\(BF = DF\),无论端点取在哪一条直径上,偏心距都相等。
两种情况进行比对,由于\(BQ > BF\)且\(AP > AE\),不包含公共部分的情况一定不优,即使枚举了也不可能纳入最优解中。真正纳入最优解的包含公共部分的情况偏心距又相等,因此在任意一条直径上求最小偏心距都是等价的。
由上述论证也可以发现,假设我们固定路径在直径上的左端点,那么右端点离左端点越远越好。枚举路径左端点,求出路径长度在\(s\)之内时的最右端点,再\(DFS\)计算偏心距即可。时间复杂度\(O(n^2)\)。