最近公共祖先(lca)与树上叉分
Posted gcfer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最近公共祖先(lca)与树上叉分相关的知识,希望对你有一定的参考价值。
lca的定义不在过多解释,
代码如下:
inline void bfs() queue<int>q; deep[s]=1;q.push(s); while(!q.empty()) int x=q.front();q.pop(); for(int i=link[x],y;i;i=a[i].next) if(deep[y=a[i].y]) continue; //如果搜索到的节点,深度已经 deep[y]=deep[x]+1; //有值,则说明已经便利过了. f[y][0]=x;q.push(y); for(int j=1;j<=20;++j) f[y][j]=f[f[y][j-1]][j-1]; inline void lca(int x,int y) if(deep[x]>deep[y]) swap(s,y); //将深度大的放在y上. for(int i=20;i>=0;--i) if(deep[f[y][i]]>=deep[x]) y=f[y][i]; //将y一直跳到和x深度一样 if(x==y) return x; for(int i=20;i>=0;--i) if(f[y][i]!=f[x][i]) x=f[x][i],y=f[y][i]; //将x与y同时跳到lca的两个儿子. return f[x][0];
树上叉分:用于树上两点以及之间的路径上各个点点区间修改:
例如:(x,y)之间路径上的点都加一,可以将x++,y++,lca(x,y)--,fa[lca(x,y)]--;最后统计各个点的权值即可.
以上是关于最近公共祖先(lca)与树上叉分的主要内容,如果未能解决你的问题,请参考以下文章