首页 > 编程语言 >离线快速LCA(最近公共祖先) Tarjan算法

离线快速LCA(最近公共祖先) Tarjan算法

时间:2023-11-03 16:33:05浏览次数:63  
标签:Tarjan 遍历 祖先 离线 子树 LCA 节点

离线快速LCA(最近公共祖先) Tarjan算法

前言

对于 OIer 来说,LCA 一直是处理树上问题的好帮手,无论是倍增还是树剖都有着优秀的 \(\log n\) 的复杂度。不过由于我们(数据规模)的上进,需要更快速求 LCA,于是就有了……

反正之前打死我都不相信这玩意能离线,还能 O(1)

算法思路

首先来一棵树:

我们然后我们将要求 LCA 的点对之间加上一条虚边:

如图,我们将对求点 (7,5)、(8,9)、(11,3) 的 LCA。

一开始每个节点属于一个并查集。

接下来我们通过原树边 DFS 遍历每一个节点,在该节点 \(u\) 的子树遍历完成之后,通过该节点 \(u\) 的虚边遍历与之求 LCA 的节点 \(v\)。

此时如果 \(v\) 已经通过原树边遍历过,那么他们的 LCA 等于 \(v\) 节点的并查集根节点。

反之则不进行任何操作。

然后节点 \(u\) 的并查集祖先设为 \(u\) 在原树上的父亲。

解释一下原理:

当前 \(u\) 子树已经遍历过以后,子树 \(u\) 的并查集根节点的子树 \(t\) 一定还没有遍历完,也就是说此时还在遍历 \(t\) 的子树,如果与节点 \(v\) 要求 LCA 的节点是 \(u\),且此时 \(v\) 通过虚边遍历到了 \(u\)。

不难发现 \((u,v)\) 的公共祖先肯定有 \(t\),而 \(u\) 和 \(v\) 又属于节点 \(t\) 不同的分支,所以 \((u,v)\) 的最近公共祖先就是 \(t\)。

这种通过并查集连接祖先求 LCA 的方法十分巧妙。

CODE

inline void dfs(int u)
{
    for(ri i=head[u];i;i=edge[i].nxt)
    {
        int v=edge[i].to;
        if(vis[v]) continue;
        dfs(v);
        fa[v]=u;//并查集连向父亲
    }
    for(pair<int,int> i:EL[u])//遍历虚边
    {
        if(vis[i.F]) Lca[i.S]=frt(i.F);//frt 求该并查集的根
    }
    vis[u]=1;//遍历标记
}
//i.F 是节点的编号,i.S 是问题的编号

时间复杂度分析

预处理 \(O(n)\),处理完直接使用 \(O(1)\)。

总时间 \(O(n)\),均摊 \(O(1)\)。

练习

P3379 【模板】最近公共祖先(LCA)

P3128 【USACO15DEC】 Max Flow P

标签:Tarjan,遍历,祖先,离线,子树,LCA,节点
From: https://www.cnblogs.com/binbinbjl/p/17807887.html

相关文章

  • Ubuntu离线安装解决办法
    步骤:XXX替换未待安装的的服务名1.查看依赖apt-cachedependsXXX2.下载deb及其依赖包apt-getdownload$(apt-cachedepends--recurse--no-recommends--no-suggests--no-conflicts--no-breaks--no-replaces--no-enhances--no-pre-dependsXXX|grep-vi386|grep"^\w"......
  • Kylin 麒麟v10 sp1 服务器版 离线安装docker的方法
    tar-zxvfdocker-20.10.16.tgzmvdocker/*/usr/bin/vi/usr/lib/systemd/system/docker.service1、编辑docker的系统服务文件vi/usr/lib/systemd/system/docker.service2、将下面的内容复制到刚创建的docker.service文件中[Unit]Description=DockerApplicationContainerEngi......
  • 安防视频监控平台EasyCVR出现目录在线,通道离线的问题该如何解决?
    视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的能力,可拓展性强......
  • 欧拉序求LCA
    使用欧拉序st表O(1)求LCA 欧拉序 st 表求LCA一开始是从某篇题解里看到的,后来百度了一下就会了(这是一种预处理 O(nlogn) ,查询 O(1) 的优秀算法。什么是欧拉序举个例子,下面是一棵树:上面有 dfs 与回溯的过程。将整个 dfs 与回溯过程写出来:1  →  2......
  • Ubuntu18.04.5配置离线镜像仓库
    1、配置apt-mirror配置文件cat>/etc/apt/apt-mirror<<EOFroot@Huawei-sources-list:/etc/apt#catmirror.list#############config####################setbase_path/var/www/html/18.04.5/#setmirror_path$base_path/mirror#setskel_path$base_p......
  • 在linux下 geoserver 离线安装GDAL
        ......
  • 离线操作
    将询问离线,根据询问的区间$[l,r]$的按特定的顺序排序。一般是按$r$进行升序。当没有询问时,可以当作是无数个区间,然后每次$r++$即可维护所有的区间,这个技术被某些人称为扫描线,但实质上是与计算几何中的扫描线不是一个东西,只是为了形象的描述而已。eq1.P1972HH的项链题解将询问......
  • centos7.9离线内核升级内核
    一、centos7离线升级系统内核1,centos7系类内核版本为3.10centos6系列内核版本为2.6,我这边操作是基于centos7.9内核进行小版本的离线升级,在线的就不在这多说了。内核版本3.10.0-1160.el7.x86_64升级为——3.10.0-1160.95.1.el7.x86_64 2,查看系统环境查看操作系统版本 [ro......
  • tarjan、缩点、删点、删边
    D.CyclicOperations好久没有用tarjan了,今天做一道题,顺便复习一下tarjan是用来求连通性的算法,时间复杂度O(n)。网上关于tarjan的博文很多,我这里就不写了,只是复习一下。这道题很容易想到建边i-a[i]:对于长度是k的环,很显然可以满足;对于长度不是k的环,无论如何都不能......
  • 如何在PS2023中安装神经网络滤镜离线安装包
    首先我们作一下简单介绍,NeuralFilters(神经网络滤镜)是从PS2021版本才开始有的,说白了就是Adobe研制的一款智能滤镜库,其实就是AI吧。NeuralFilters通过生成新的像素来帮助我们优化、处理和修改图像,新产生的像素不会存在于原始图像中。目前PS2023版本中有12款NeuralFilters滤镜。主......