问题:给定四个节点(a,b),(c,d),考虑(a,b)的树上最短路与(c,d)的树上最短路是否有交点;
思路一:
如果存在交点,(a,b)或者(c,d)的LCA必定在另一条路径上!
设(a,b),(c,d)之间存在相交的一段路径(e,f)
也即是(e,f)是路径a,b;c,d的一个子集
如果(a,b)的LCA在(e,f)上,则显然有LCA(e,f)=LCA(a,b);
因为如果e,f的LCA不是a,b的LCA,而LCA(a,b)在(e,f)上,那么e,f的LCA深度必然比a,b的小,那么a,b,的LCA就应该是e,f的了!
而(e,f)有同时是c,d的一段,同理,LCA(c,d)=LCA(e,f)=LCA(a,b);
因此c,d的LCA在a,b的路径上且即使a,b的LCA
如果(a,b)的LCA不在(e,f)上
令LCA(a,b)=x,LCA(c,d)=y;
容易知道:x的深度比LCA(e,f)要小
而容易知道:e,f的深度比c,d要小,那么
必然有y=LCA(e,f)
也即是y在(a,b)上
综合,当存在交集时,深度较深的LCA必然在深度较浅的LCA的路径上!
那么如何验证一个点是否是在一条路径上呢?
1.计算出这个点到两个端点的距离和,如果等于两点长度,则在
2.对于路径(s,t)
如果LCA(s,x)=x或LCA(t,x)=x成立,则在
原文:https://www.cnblogs.com/little-cute-hjr/p/11737163.html