博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法模板——倍增求LCA
阅读量:6095 次
发布时间:2019-06-20

本文共 1839 字,大约阅读时间需要 6 分钟。

LCA是什么?

最近公共祖先,就是树上的两个点它们深度最大(离根节点最远)的公共祖先。

算法

1. 朴素算法。时间复杂度O(n×q)。并没有实际意义。
2. 倍增算法。时间复杂度O((n+q)logn)

倍增算法

它的特点是:每次向祖先跳的距离,不是1,而是2k,这样可以省很多时间。
记录每个点的fai,j,表示i号节点向根跳2j步的点,如果跳过了根记为0。那么显然,第一步是要把要询问的两个节点都跳到同一深度,第二步同时往根跳。这样就找到了这两个点的LCA。

代码

#include 
#include
const int maxn=500000;inline int read(){ int x=0,f=1; char ch=getchar(); while((ch<'0')||(ch>'9')) { if(ch=='-') { f=-f; } ch=getchar(); } while((ch>='0')&&(ch<='9')) { x=x*10+ch-'0'; ch=getchar(); } return x*f;}inline int print(int x,int mode=0){ if(!mode) { if(!x) { putchar('0'); return 0; } if(x<0) { putchar('-'); x=-x; } } if(x) { print(x/10,1); putchar(x%10+'0'); } return 0;}struct tree{ int pre[maxn*2+10],now[maxn+10],son[maxn*2+10],tot; int deep[maxn+10],fa[maxn+10][20]; int ins(int a,int b)//建图 { tot++; pre[tot]=now[a]; now[a]=tot; son[tot]=b; return 0; } int dfs(int u,int father)//预处理,把每个点的fa都处理出来 { deep[u]=deep[father]+1; fa[u][0]=father; for(int i=1; i<=19; i++) { fa[u][i]=fa[fa[u][i-1]][i-1]; } int j=now[u]; while(j) { int v=son[j]; if(v!=father) { dfs(v,u); } j=pre[j]; } return 0; } int lca(int x,int y)//求LCA { if(deep[x]
=0; i--) { if(deep[fa[x][i]]>=deep[y]) { x=fa[x][i];//将深度大点的往上跳,当然不能跳过另一个点 } } if(x==y) { return x;//如果找到答案了退出 } for(int i=19; i>=0; i--) { if(fa[x][i]!=fa[y][i])//同时向上跳,当然不能跳到一起去 { x=fa[x][i]; y=fa[y][i]; } } return fa[x][0];//最后再跳到一起,那么这个点一定是LCA }};tree t;int n,m,root;int main(){ n=read(); m=read(); root=read(); for(int i=1; i

转载于:https://www.cnblogs.com/Canopus-wym/p/10376290.html

你可能感兴趣的文章
大数乘法
查看>>
迅雷网速测试器 - 下载速率测试记录
查看>>
Restrict each user to a single session in window server 2008 R2 or 2012
查看>>
可用的网址
查看>>
python学习笔记-(十)面向对象基础
查看>>
C#中This关键字在同名构造函数中的应用
查看>>
第五讲 二维费用的背包问题(粗糙,勿点)
查看>>
工作小结 8.10
查看>>
python爬虫<urlopen error [Errno 10061] >
查看>>
稻盛和夫_经典语录
查看>>
BZOJ 4819 [Sdoi2017]新生舞会 ——费用流 01分数规划
查看>>
第五周总结
查看>>
Frame structure -- TDSCDMA
查看>>
ITIL学习心笔记总结
查看>>
html5 canvas图片翻转
查看>>
MS SQL Server 计算列用到自定义函数 创建索引
查看>>
Mac安装软件时,提示文件已损坏,需要移动到废纸篓的解决方法
查看>>
【最小生成树+LCA】Imperial roads
查看>>
小程序登录
查看>>
Jquery环境搭建前言
查看>>