您的位置:首页 > 其它

倍增LCA 模板

2016-07-08 15:46 162 查看
基本思想是用类似rmq的算法

f[i,j]表示点i向上跳2j步后的点

预处理f

fa[i]为i的父亲

fo(i,1,n) f[i][0]=fa[i];
fo(j,1,16)
fo(i,1,n) f[i][j]=f[f[i][j-1]][j-1];


求lca

int lca(int x,int y)
{
fd(i,16,0) if(deep[f[x][i]]>=deep[y]) x=f[x][i];
fd(i,16,0) if(deep[f[y][i]]>=deep[x]) y=f[y][i];
fd(i,16,0) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
if (x!=y) x=f[x][0],y=f[y][0];return x;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: