LCA倍增法
来源:互联网 发布:惊天破仔仔换头像软件 编辑:程序博客网 时间:2024/06/05 01:04
LCA-倍增法(在线)O(nlogn)-O(logn)
1. DFS预处理出所有节点的深度和父节点
inline void dfs(int u){ int i; for(i=head[u];i!=-1;i=next[i]) { if (!deep[to[i]]) { deep[to[i]] = deep[u]+1; p[to[i]][0] = u; //p[x][0]保存x的父节点为u; dfs(to[i]); } }}
2. 初始各个点的2^j祖先是谁 ,其中2^j(j=0...log(该点深度))倍祖先,1倍祖先就是父亲,2倍祖先是父亲的父亲......。
void init(){ int i,j; //p[i][j]表示i结点的第2^j祖先 for(j=1;(1<<j)<=n;j++) for(i=1;i<=n;i++) if(p[i][j-1]!=-1) p[i][j]=p[p[i][j-1]][j-1];//i的第2^j祖先就是i的第2^(j-1)祖先的第2^(j-1)祖先}
3.从深度大的节点上升至深度小的节点同层,如果此时两节点相同直接返回此节点,即lca。
否则,利用倍增法找到最小深度的p[a][j]!=p[b][j],此时他们的父亲p[a][0]即lca。
int lca(int a,int b)//最近公共祖先{ int i,j; if(deep[a]<deep[b])swap(a,b); for(i=0;(1<<i)<=deep[a];i++); i--; //使a,b两点的深度相同 for(j=i;j>=0;j--) if(deep[a]-(1<<j)>=deep[b]) a=p[a][j]; if(a==b)return a; //倍增法,每次向上进深度2^j,找到最近公共祖先的子结点 for(j=i;j>=0;j--) { if(p[a][j]!=-1&&p[a][j]!=p[b][j]) { a=p[a][j]; b=p[b][j]; } } return p[a][0];}
0 0
- 【LCA】倍增法 LCA
- LCA倍增法模板
- 倍增法求LCA
- LCA倍增法
- hdu5266 LCA 倍增法
- LCA倍增法
- lca倍增法
- LCA倍增法
- 倍增法求LCA
- 在线LCA倍增法
- 倍增法求LCA
- 倍增法求LCA
- 倍增法求 LCA
- Lca倍增法
- LCA倍增法
- 倍增法求LCA
- 浅谈倍增法求LCA
- 倍增法求LCA模版
- Jrebel 6.2.1破解
- web.xml文件的作用
- 【more effective c++读书笔记】【第3章】异常(1)
- 在微信中添加自己的微信公众号名片以及发纯文字链接教程
- 关于MongoDb的简单入门
- LCA倍增法
- Linux下的进程间通信-详解
- java线程同步
- 【水】【卡内存】【bzoj 2456】mode
- Andrew Ng机器学习课程7
- XML与JSON的比较
- 我的openwrt学习笔记(二十四):WIFI无线传输速率相对测试方法_netcat
- VC创建无窗口的控制台程序
- Linux文件解压