您的位置:首页 > 其它

倍增法lca

2016-03-22 08:51 225 查看
intdep
,rt[25]
,siz
;//rt数组需要在dfs之前置-1。

voiddfs(intpos,intdeep){
dep[pos]=deep;
siz[pos]=1;
for(edge*it=adj[pos];it;it=it->next){
if(!dep[it->id]){
rt[0][it->id]=pos;
dfs(it->id,deep+1);
siz[pos]+=siz[it->id];
}
}
}

voidprelca(){
for(inti=1;i<=20;i++){
for(intj=1;j<=n;j++){
rt[i][j]=rt[i-1][j]==-1?-1:rt[i-1][rt[i-1][j]];
}
}
}

intLCA(intu,intv){//查询u和v的lca
if(dep[u]<dep[v])swap(u,v);
for(inti=0;i<21;i++){
if((dep[u]-dep[v])>>i&1){
u=rt[i][u];
}
}
if(u==v)returnu;
for(inti=19;i>=0;i--){
if(rt[i][u]!=rt[i][v]){
u=rt[i][u];
v=rt[i][v];
}
}
returnrt[0][u];
}

intjump(intpos,intnum){//查询节点pos的第num个父亲
for(inti=0;i<21;i++){
if(num>>i&1){
pos=rt[i][pos];
}
}
returnpos;
}




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: