LCA(最近公共祖先)倍增算法
来源:互联网 发布:门禁发卡软件 编辑:程序博客网 时间:2024/06/05 03:11
最近公共祖先有多种算法
如倍增,RMQ,树链剖分等
这里先介绍倍增算法
预处理复杂度nlog(n);
询问复杂度log(n);
倍增与二进制息息相关
与分块的算法有些相似之处
使用倍增算法时开一个fa[n][S]
数组 fa[i][j]
表示 i 这个点向上的第1^j个父亲是谁
以下是关于如何预处理fa[i][j]
的代码
void init() { FOR(j,1,S-1)FOR(i,1,n) fa[i][j]=fa[fa[i][j-1]][j-1];}
关于LCA还有一个重点就是记录每一个节点的深度
这个可以在建树时处理出来
这里就不给出代码
最后一个小细节,就是寻找LCA时注意判断当两点在同一深度时是否已为同一点(因为在使用倍增时最后要a=fa[a][0]
)
LCA实现代码
void up(int &x,int len) { FOR(i,0,S-1)if(len&(1<<i))x=fa[x][i];}int LCA(int a,int b) { if(deep[a]<deep[b])swap(a,b); up(a,deep[a]-deep[b]); if(a==b)return a; DOR(i,S-1,0)if(fa[a][i]!=fa[b][i]) { a=fa[a][i]; b=fa[b][i]; } return fa[a][0];}
阅读全文
1 0
- 最近公共祖先 LCA 倍增算法
- 最近公共祖先LCA倍增算法
- LCA(最近公共祖先)倍增算法
- 最近公共祖先 LCA 倍增算法
- 最近公共祖先(LCA)及其倍增算法实现
- c++最近公共祖先LCA(倍增算法和tarjan)
- 倍增LCA(最近公共祖先)算法详解
- [笔记]LCA最近公共祖先---倍增在线算法
- 树上两点最近公共祖先LCA的倍增算法 poj1986
- 最近公共祖先(LCA)---倍增法
- 最近公共祖先(LCA):倍增
- 最近公共祖先 LCA 倍增+Tarjan实现
- poj 1986 最近公共祖先 (lca 倍增)
- 倍增法求最近公共祖先 lca
- 【LCA倍增模板】【poj1330】最近公共祖先
- LCA最近公共祖先算法
- LCA最近公共祖先算法
- LCA最近公共祖先算法
- Hadoop: What it is, how it works, and what it can do
- ubuntu虚拟机重启后进入initramfs的解决办法 (转)
- go 文件差量对比,并用天做区分文件夹(几个月的精减版)
- 基于socket(TCP)和opencv的实时视频传输
- 简单的设计模式||六大原则
- LCA(最近公共祖先)倍增算法
- Buy the Ticket(卡特兰数 + JAVA大数)
- 字符设备驱动(一)
- Linux目录结构
- 【Appium+python】特殊键盘事件处理-国产机型的搜索处理。
- pyspark与jupyter集成
- python和Django创建博客首页视图
- NumPy基础--ndarray
- Leetcode之Move Zeroes 问题