LCA算法:
LCA(Least Common Ancestor),是指在一棵树中,距离两个点最近的两者的公共节点。也就是说,在两个点通往根的道路上,肯定会有公共的节点,我们就是要求找到公共的节点中,深度尽量深的点。还可以表示成另一种说法,就是如果把树看成是一个图,这找到这两个点中的最短距离。
ancestor表示的是当前节点集合的祖先。
int find(int x)
{
if(pra[x]==x)return x;
return pra[x]=find(pra[x]);
}
int unite(int a,int b)
{
int x = find(a);
int y = find(b);
pra[y] = x;
}
void LCA(int parent)
{
pra[parent] = parent; //当访问到一个点的时候,先将其自己形成一个集合
ancestor[find(parent)] = parent;
for(int i=0;i<=child[parent].size();i++)
{
LCA(child[parent][i]); //依次对子节点进行访问。
unite(parent,child[parent][i]); //在处理完后,将子节点的集合链接到父节点
ancestor[find(child[parent][i])] = parent;//将这个集合的祖先设置成parent,同时起到了压缩路径的作用
}
vis[parent] = true;
if( parent = first && vis[second] ) //这里的first和second主要针对的是查询的每次操作时输入的两个数。
ans = ancestor[find(second)] ;
if( parent = second && vis[first] )
ans = ancestor[find(first)];
}