#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的祖先; 所以x和y都是b的祖先 → 它们一定有祖先-后代关系。
同理,x和z、y和z也都有祖先-后代关系。
三个点两两可比,它们在树上就只能排成一条竖线(一条链)。
现在给这三个点按深度排序,从深到浅(离根从远到近):
- 最深(最下面)的叫
D - 中间的叫
M - 最浅(最靠近根)的叫
S
我们来看看这三个点分别对应 x、y、z 里的哪一个。
分情况看
情况①:三个点本来就在一条直线上
例如 a 是 b 的祖先,b 是 c 的祖先:
a (最老)
|
b
|
c (最年轻)
那么:
LCA(a,b) = aLCA(b,c) = bLCA(c,a) = a
结果:a 出现两次,b 出现一次。两个相等,一个不同。
不同的那个是 b(更深)。
情况②:一个点在一边,两个点在另一边(最常见的三岔口) 比如:
root
/ \
P ...
/ \
a Q
/ \
b c
这里 LCA(a,b) = P,LCA(b,c) = Q,LCA(c,a) = P。
结果:P 出现两次,Q 出现一次。又是两个相等,一个不同。
不同的那个是 Q(更深)。
情况③:三个点分别从三个不同方向汇聚到同一个祖先
root
/ | \
a b c
那么:
LCA(a,b) = rootLCA(b,c) = rootLCA(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 找到的那个“不一样的”最深祖先(如果全相等,那就是它本身)。