与正文无瓜的前言

身为一个高一才开始学的OIER,现在才开始恶补模板,感觉今年就要退役了。

不想刷题了滚过来写写博客<-------极端危险的思想。

引入

LCA(Lowest Common Ancestors),即最近公共祖先,听名字就知道这是与树上两个节点有关的东西。

它的定义就是两个点最近的公共祖先(废话),同时它也是树上一个节点到另一个节点的最短路中经过的深度最小的点。

如图,2就是8与9的最近公共祖先,7就是10和12的最近公共祖先。

那么LCA有什么用呢?

举个例子,我们可以利用LCA在O(1)的时间复杂度内求出树上两点u,v的最短距离。这里用dep表示节点的深度。

dis(u,v)=dep(u)+dep(v)-2*dep(LCA(u,v));

所以能快速求出LCA就可以快速求出两点间的距离。当然LCA还有其它作用,这里就不再赘述了(其实我并不知道)。

正文

我们来想一下一般的LCA求法。

对于任意两个节点u,v,如果我们一开始让它们同时向上寻找祖先,因为它们深度可能不同,其中深度较低的点就会向上走过头。

就像这样:

所以我们先让深度较深的点先向上走,走到与另一个点深度相同时,两个点再肩并肩向上走,找到第一个公共祖先为止。

而用倍增求LCA的方法也跟这个差不多,只不过不是一步一步向上走,而是先预处理出每个点向上走2^k步到达的节点,再向上飞。

设fa[i][j]为i节点向上走2^j步到达的节点,那么fa[i][j]可以这么转移:fa[i][j]=fa[ fa[i][j-1] ][j-1]转移过来。

这里介绍两种预处理的方式。

一种是一边遍历树一边处理,代码如下:

void dfs(int x,int f)
{
dep[x]=dep[fa[x][]=f]+;
for(int j=;j<=;j++)
fa[x][j]=fa[fa[x][j-]][j-];
for(int i=info[x];i;i=nex[i])if(v[i]!=f)dfs(v[i],x);
}

另一种是先遍历,然后处理,代码:

 void dfs(int x,int f)
{
dep[x]=dep[fa[x][]=f]+;
for(int i=info[x];i;i=nex[i])if(v[i]!=f)dfs(v[i],x);
}
void pre()
{
dfs(,);
for(int j=;j<=LOG;j++)for(int i=;i<=n;i++)
fa[i][j]=fa[fa[i][j-]][j-];
}

预处理完后,我们就可以让深度较深的节点快速的与另一个节点会和,然后比翼双飞

直接给出代码和注解:

int lca(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
int delta=dep[x]-dep[y];
for(int i=LOG;i>=;i--)
if(delta&(<<i))x=fa[x][i];//将delta转化为二进制,再用2^i凑出来
if(x==y)return x;
for(int i=LOG;i>=;i--)//用2^i凑距离,对于每个2^i只有可能被用一次,从大到小就是为了防止多用。
if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];//如果相等就一起向上飞,会飞到公共祖先,但不是最近的
return fa[x][];
}

最新文章

  1. 在linux下Ant的环境配置
  2. 基于PHP以及Mysql,使用WordPress搭建站点
  3. 写essay和research paper必用的17个网站
  4. Web性能压力测试工具之ApacheBench(ab)详解
  5. Java 中判断两个对象是否相等
  6. 使用resumable.js上传大文件(视频)兵转换flv格式
  7. eclipse 不能切换输入法
  8. usaco 奶牛集会 &amp;&amp; 奶牛抗议
  9. 基于.net 职责链来实现 插件模式
  10. cocos2dx lua binding ,cocos2dx 绑定lua测试
  11. Android使用 startActivityForResult 、 onActivityResult 时的注意事项
  12. jQuery手风琴菜单!!!!
  13. 解决svn--Unable to connect to a repository at URL ‘https://xxxxxx’ 问题
  14. 使用 Moq 测试.NET Core 应用 -- Mock 方法
  15. LNMP安装目录及配置文件位置
  16. SharePoint附加内容数据库时报错
  17. 检测mysq组复制的脚本
  18. [2017BUAA软工助教]个人项目小结
  19. EF Core中DbContext可以被Dispose多次
  20. Mongodb主从复制 及 副本集+分片集群梳理

热门文章

  1. vue基础:组件的创建方式和组件的data值
  2. 刚接触HTML5应该先学哪里才好?
  3. Vscode选中变量高亮问题
  4. 修改redhat7默认显示语言从中文为英文
  5. Redis持久化从rdb切换到aof
  6. zabbix4.2监控nginx
  7. spark HMM
  8. P1559 运动员最佳匹配问题[最大费用最大流]
  9. Python高级编程和异步IO并发编程(笔记)
  10. 自定义菜单和高级接口-获取Access Token