#9969. 三点最短距离笔记

三点最短距离笔记

1. 三个 LCA 为什么一定有两个相等?

把树想象成一棵倒挂的家族树(根在顶端)。
任意两个节点的 LCA 就是它们往上走,第一次碰面的那个祖先

现在有三个节点 a, b, c,我们求:

x = LCA(a,b)
y = LCA(b,c)
z = LCA(c,a)

关键点:x、y、z 三个点一定在 同一条到根的链上

因为:

  • x 既是 a 的祖先,又是 b 的祖先;
  • y 既是 b 的祖先,又是 c 的祖先; 所以 xy 都是 b 的祖先 → 它们一定有祖先-后代关系。
    同理,xzyz 也都有祖先-后代关系。

三个点两两可比,它们在树上就只能排成一条竖线(一条链)。

现在给这三个点按深度排序,从深到浅(离根从远到近):

  • 最深(最下面)的叫 D
  • 中间的叫 M
  • 最浅(最靠近根)的叫 S

我们来看看这三个点分别对应 x、y、z 里的哪一个。


分情况看

情况①:三个点本来就在一条直线上 例如 ab 的祖先,bc 的祖先:

a (最老)
|
b
|
c (最年轻)

那么:

  • LCA(a,b) = a
  • LCA(b,c) = b
  • LCA(c,a) = a

结果:a 出现两次,b 出现一次。两个相等,一个不同。
不同的那个是 b(更深)。


情况②:一个点在一边,两个点在另一边(最常见的三岔口) 比如:

        root
       /    \
      P      ...
     / \
    a   Q
       / \
      b   c

这里 LCA(a,b) = PLCA(b,c) = QLCA(c,a) = P
结果:P 出现两次,Q 出现一次。又是两个相等,一个不同。
不同的那个是 Q(更深)。


情况③:三个点分别从三个不同方向汇聚到同一个祖先

      root
     / | \
    a  b  c

那么:

  • LCA(a,b) = root
  • LCA(b,c) = root
  • LCA(c,a) = root

三个 LCA 全部相等,都是 root
这是“全相等”的情况,可以看成“两个相等”的特例(第三个也和它们相等)。


结论

由于三个 LCA 只能排成一条链,计算时必然会呈现:

  • 两个重复(较浅的那个祖先),
  • 一个单独(较深的那个祖先,如果三者不重合)。

如果三个 LCA 完全一样,说明三点已经完美汇聚在同一个祖先上,那个祖先就是单独的“它自己”。


2. 那个“不同的” LCA 就是最佳聚会地点

我们可以这样想:
三个点之间的路径会形成一个“Y”字形(或一条线)。
那个不一样(且最深)的 LCA,恰好就是这个“Y”字形的中心交叉点

让三个人都走到这个交叉点,谁都不走冤枉路,总路程最短。
总费用公式: [ \text{总距离} = \frac{d(a,b) + d(b,c) + d(c,a)}{2} ] 这个值只有在这个交叉点才能取到。


3. 最优的 P 只有一个吗?

是的,只有一个。

你可以试想:从我们找到的这个点 P 出发,往任意方向走一步,总距离会怎么变?

a, b, c 三个点看作三个“吸引源”。
当你移动一步时:

  • 如果这一步让你靠近某个点,那这个点的距离就 减1
  • 同时,你会远离另外的点,那些点的距离就 加1

设这一步让你靠近了 k 个点(k = 0, 1, 2, 3),那么总费用的变化就是: [ \text{变化量} = -k + (3 - k) = 3 - 2k ]

k 只能是 0,1,2,3,所以 3-2k 只能是 3, 1, -1, -3——全都是奇数,永远不可能等于 0。

这意味着:

  • 如果你站在最优点,往任何一个方向移动,总距离一定会严格增加
  • 所以不可能有两个不同的点同时并列最优。

因此,使总费用最小的城市有且仅有一个
就是我们通过 LCA 找到的那个“不一样的”最深祖先(如果全相等,那就是它本身)。