1.定义

倍增法,顾名思义就是翻倍。它能够大大地优化时间复杂度。这个方法在很多算法中均有应用,例如求 LCA(最近公共祖先)。(大雾)

2.框架

如下图,我们想找 \(4\) 和 \(8\) 的最近公共祖先,该怎么做呢?



以人类智慧来解决,当然就是一眼看出来,他们两个的最大公共祖先是根节点,如图:



但计算机可不知道这些,所以倍增算法应运而生

他的思路是什么呢?还如图为例。

我们先让两个查询节点位于同一层上,如图



改变后为



(\(7\) 为 \(8\))

好的,然后我们让两个节点分别向上“跳”,如图



因为下面的节点没什么用,所以我在图片中删除,但在运行过程中并不是。

继续向上跳



这是我们发现,两个点出现在一起,所以 \(1\) 就是他们的最大公共祖先。

3.代码

int get_depth(int node,int father)//当前点和父亲
{
depth[node]=depth[father]+1;
fa[node][0]=father;
for(int i=1;i<=lg2[depth[node]]-1;i++)
fa[node][i]=fa[fa[node][i-1]][i-1];//node的2^i级父亲等于它的 2^(i-1)级父亲的2^(i-1)级父亲
for(int i=head[node];i;i=tree[i].next)
if(tree[i].to!=father) get_depth(tree[i].to,node);
} inline int LCA(int x,int y)
{
if(depth[x]<depth[y])
temp=x,x=y,y=temp;//确保x更深,便于处理
while(depth[x]>depth[y])
x=fa[x][lg2[depth[x]-depth[y]]-1];//跳到相同高度
if(x==y) return x;
for(int i=lg2[depth[x]]-1;i>=0;i--)
if(fa[x][i]!=fa[y][i])
x=fa[x][i],y=fa[y][i];
return fa[x][0];//注意返回的不是x,是x的父亲
}

完结散花 ⎛⎝≥⏝⏝≤⎛⎝

[学习笔记]最近公共祖先(LCA)之倍增算法的更多相关文章

  1. 学习笔记--最近公共祖先(LCA)的几种求法

    前言: 给定一个有根树,若节点\(z\)是两节点\(x,y\)所有公共祖先深度最大的那一个,则称\(z\)是\(x,y\)的最近公共祖先(\(Least Common Ancestors\)),简称\ ...

  2. [一本通学习笔记] 最近公共祖先LCA

    本节内容过于暴力没什么好说的.借着这个专题改掉写倍增的陋习,虽然写链剖代码长了点不过常数小还是很香. 10130. 「一本通 4.4 例 1」点的距离 #include <bits/stdc++ ...

  3. LCA(最近公共祖先)之倍增算法

    概述 对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. 如图,3和5的最近公共祖先是1,5和2的最近公共祖先是4 在本篇中我们先介 ...

  4. 【洛谷 p3379】模板-最近公共祖先(图论--倍增算法求LCA)

    题目:给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 解法:倍增. 1 #include<cstdio> 2 #include<cstdlib> 3 #include ...

  5. 求最近公共祖先(LCA)的各种算法

    水一发题解. 我只是想存一下树剖LCA的代码...... 以洛谷上的这个模板为例:P3379 [模板]最近公共祖先(LCA) 1.朴素LCA 就像做模拟题一样,先dfs找到基本信息:每个节点的父亲.深 ...

  6. POJ 1470 Closest Common Ancestors (最近公共祖先LCA 的离线算法Tarjan)

    Tarjan算法的详细介绍,请戳: http://www.cnblogs.com/chenxiwenruo/p/3529533.html #include <iostream> #incl ...

  7. 最近公共祖先LCA Tarjan 离线算法

    [简介] 解决LCA问题的Tarjan算法利用并查集在一次DFS(深度优先遍历)中完成所有询问.换句话说,要所有询问都读入后才开始计算,所以是一种离线的算法. [原理] 先来看这样一个性质:当两个节点 ...

  8. 近期公共祖先(LCA)——离线Tarjan算法+并查集优化

    一. 离线Tarjan算法 LCA问题(lowest common ancestors):在一个有根树T中.两个节点和 e&sig=3136f1d5fcf75709d9ac882bd8cfe0 ...

  9. 求LCA最近公共祖先的在线倍增算法模板_C++

    倍增求 LCA 是在线的,而且比 ST 好写多了,理解起来比 ST 和 Tarjan 都容易,于是就自行脑补吧,代码写得容易看懂 关键理解 f[i][j] 表示 i 号节点的第 2j 个父亲,也就是往 ...

  10. POJ1470Closest Common Ancestors 最近公共祖先LCA 的 离线算法 Tarjan

    该算法的详细解释请戳: http://www.cnblogs.com/Findxiaoxun/p/3428516.html #include<cstdio> #include<alg ...

随机推荐

  1. 干货分享:Air700ECQ的硬件设计,第一部分

    ​ 一.绪论 Air700ECQ是一款基于移芯EC716E平台设计的LTE Cat 1无线通信模组.支持移动双模FDD-LTE/TDD-LTE的4G远距离无线传输技术.以极小封装,极高性价比,满足Io ...

  2. [昌哥IT课堂]|如何确定 MySQL 服务器是否为 LTS 版本(译)

    根据支持 LTS(长期支持)发布的新发布模型,给定的 MySQL 服务器将分为以下两类: 要么是 LTS 版本. 要么是创新版本. 本博客文章将解释如何确定给定的 MySQL 服务器是否为 LTS 版 ...

  3. 开发工具之DevToys

    DevToys 号称开发人员的瑞士军刀,可以帮助完成一些日常任务,比如格式化 JSON.比较文本.测试正则等,无需使用许多不真实的网站来处理的数据. 借助智能检测,DevToys 能够检测出可以处理在 ...

  4. 一步步教你学会如何区域录制屏幕转换成gif图

    现在各种表情包都是gif图,包括很多可能比较短暂的操作步骤,录制gif图也要远比录制成视频要来的方便很多. 1. GIF文件通常比视频文件小,这使得它们在网络传输中更加高效,尤其是在带宽有限的情况下. ...

  5. ServiceMesh 5:异常重试和超时保护提升服务可用性

    ★ ServiceMesh系列 1 背景 在复杂的互联网场景中,不可避免的会出现请求失败或者超时的情况. 从程序的的响应结果来看,一般是Response返回5xx状态的错误:从用户的角度去看,一般是请 ...

  6. 聊一聊坑人的 C# MySql.Data SDK

    一:背景 1. 讲故事 为什么说这东西比较坑人呢?是因为最近一个月接到了两个dump,都反应程序卡死无响应,最后分析下来是因为线程饥饿导致,那什么原因导致的线程饥饿呢?进一步分析发现罪魁祸首是 MyS ...

  7. arm mattermost

    It's not so hard, here is my working steps for arm64 device. cd ~/build/mattermost wget https://raw. ...

  8. Qt边推流边录制/实时性好延迟低/16路1080P推流加录制只占1%CPU/优化到极致

    一.前言 这个一边推流一边录制的功能,有很多用户提到过,之前因为时间的原因,一直没有搞,年初的时候索性抽空搞了下,也着实费了些功夫.推流用的是ffmpeg这个开源的牛逼的第三方库,搞音视频开发的人应该 ...

  9. Qt编写安防视频监控系统49-多数据库支持

    一.前言 数据库设置模块,因为很多项目都会用到,索性这期间也将这玩意重新架构了一遍,对应的数据库组件同样重写了一遍,关于数据库的参数无非就6个,数据库类型(sqlite.mysql等).数据库名称.主 ...

  10. Qt开源作品18-无边框背景透明窗体

    一.前言 用Qt来做无边框北京透明窗体非常简单,根本不需要用什么系统层的API来实现透明什么的,Qt本身提供了很多种设置窗体透明的方法,除了可以设置窗体的属性为透明以外,还可以设置透明度函数,以及qs ...