• 公共祖先问题

函数名解释
deep[i]:i点的深度
fa[i][j]:第i点 上面第2^j的祖先的编号

伪代码

int lca(int x,int y)
{
    if(deep[y]>deep[x])
        swap(x,y);//假设x的深度大于y的深度
    for(int i=20;i>=0;i--)
        if(deep[fa[x][i]]>=deep[y])//利用倍增 使x追上y的深度
            x=fa[x][i];
    if(x==y) return x;//特判
    for(int i=20;i>=0;i--)//x,y 同时向上寻找
        if(fa[x][i]!=fa[y][i])
        {
            x=fa[x][i];
            y=fa[y][i];
        }
    return fa[x][0];//返回父亲
}