LCA的应用,LCA的伪代码:
void LCA(u)
{
s[u]=u; //初始化并差集
for(u的每个儿子v)
{
LCA(v);
s[v]=FIND(u);
}
color[u]=black;
for(Q(u)中的所有元素v) //如果存在询问LCA(u,v),就把v存在集合Q(u)里
if(color[v]==black) LCA(u,v)为FIND(u)
}
LCA问题的一个应用是求树上两点间距离。
只需计算出根到每个点的距离dis[],求出两点u,v的最近公共祖先lca(u,v),那么u,v两点间距离=dis[u]+dis[v]-2*dis[lca(u,v)]。
然后,对于这类求距离的问题,我凸眼土土的发现,对于一棵树来讲,其实任意一点都可以作为这个树的根。