首页 > 其他分享 >LCA

LCA

时间:2023-12-27 12:44:44浏览次数:29  
标签:log dfs fa dfn LCA 欧拉

ST 表 LCA

\(O(n\log n)\) 预处理,\(O(1)\) 查询。空间 \(O(n\log n)\)

考虑欧拉序,设 \(dfn[u]\) 为点 \(u\) 在欧拉序中第一次出现的位置
不妨设 \(dfn[u]<dfn[v]\),\(lca(u,v)\) 即为 \([dfn[u],dfn[v]]\) 中深度(或者 \(dfn\))最小的点
剩下的问题是静态 RMQ,ST 表解决

优化

做法来自 skip2004Alex_Wei

欧拉序长度是 \(2n-1\),但询问的端点只有 \(n\) 个,这为优化提供了可能

考虑相邻的两个端点 \(u,v\)(即“第一次 dfs 到”\(u\) 后第一个“第一次 dfs 到”的点是 \(v\)),我们希望知道 \([dfn[u]+1,dfn[v]]\) 中 \(dfn\) 最小的结点从而把这一段缩起来,下证这个点是 \(fa[v]\)

  1. \(u\) 是 \(v\) 的祖先:一定有 \(u=fa[v]\),否则 \(u,v\) 之间的点都是“第一次 dfs 到”
  2. 否则:dfs 的过程一定是从 \(u\) 回溯到 \(lca(u,v)\),再一步走到 \(v\)

具体实现看代码比较好懂

标签:log,dfs,fa,dfn,LCA,欧拉
From: https://www.cnblogs.com/ft61/p/17929543.html

相关文章

  • [Ynoi2007]rfplca/[CF1491H] Yuezheng Ling and Dynamic Tree
    题目描述给定一棵大小为\(n\)的\(1\)为根节点的树,树用如下方式给出:输入\(a_2,a_3,\dots,a_n\),保证\(1\leqa_i<i\),将\(a_i\)与\(i\)连边形成一棵树。接下来有\(m\)次操作,操作有两种:1lrx令\(a_i=\max(a_i-x,1)(l\leqi\leqr)\)。2uv查询在当前的\(a\)......
  • st表lca
    structLca{ inttot=0; intdep[N],pos[N],lca[N*2][20],lg[N*2]; voidpre(intx,intfa){ dep[x]=dep[fa]+1,pos[x]=++tot,lca[tot][0]=x; for(inti=h[x];i;i=d[i].n){ inty=d[i].b; if(y==fa)continue; pre(y,x);lca[++tot][0]=x; } } intxiao(in......
  • MySQL 连接字符串中加入 nullCatalogMeansCurrent = true 的含义
    nullCatalogMeansCurrent的含义:nullCatalogMeansCurrent=true#在指定的数据库中查找需要的表nullCatalogMeansCurrent=false#在服务器全部数据库中查找需要的表不同MySQL驱动nullCatalogMeansCurrent默认情况:从mysql-connector-java5.x版本起,nullCatal......
  • P3379 【模板】最近公共祖先(LCA)
    原题链接非常详细的题解见洛谷,个人见解见代码#include<bits/stdc++.h>usingnamespacestd;#defineN500005vector<int>G[N];//链树,以链上的元素为根节点的树voidadd(intx,inty){G[x].push_back(y);G[y].push_back(x);}intfa[N][21]={0};intdepth[N]......
  • 最近公共祖先(LCA)
    最近公共祖先(LCA)概念在有根树中,两个点,会有共同的祖先,离他们两最近的公共祖先,即为LCA求法向上表记法O(n)从一个点开始,向上遍历,把走过的点标记一下再从另外一个点开始,向上遍历,如果走到的点已经被标记,即为LCA最坏的情况是条链,\(O(n)\)的复杂度倍增法O(logn)先预处理下各......
  • 11.21学习小结 //LCA
    倍增求LCA参考博文:https://www.cnblogs.com/hulean/p/11144059.html参考博文:https://www.cnblogs.com/jvxie/p/4854719.html·记录每个点的深度,和往前2^i的祖先。·先把两个点提到同一高度,再统一开始跳。不可以直接跳到相同祖先处,因为可能是LCA的祖先·裸板子:洛谷P3379wa......
  • CF1304E 1-Trees and Queries(lca+树上前缀和+奇偶性)
    题目二话不说,直接按题意模拟暴搜,当然\(O(nq)\)的复杂度显然是寄了的。不过,在模拟的过程中,我在链式前向星的删边中居然一开始错了,还是要mark一下以后注意。voiddel(intx,intpre){ e[top].to=e[top].next=0; h[x]=pre;//h[x]=0;<---tip}intmain(){ ......
  • 离线快速LCA(最近公共祖先) Tarjan算法
    离线快速LCA(最近公共祖先)Tarjan算法前言对于OIer来说,LCA一直是处理树上问题的好帮手,无论是倍增还是树剖都有着优秀的\(\logn\)的复杂度。不过由于我们(数据规模)的上进,需要更快速求LCA,于是就有了……反正之前打死我都不相信这玩意能离线,还能O(1)算法思路首先来一棵树:......
  • 欧拉序求LCA
    使用欧拉序st表O(1)求LCA 欧拉序 st 表求LCA一开始是从某篇题解里看到的,后来百度了一下就会了(这是一种预处理 O(nlogn) ,查询 O(1) 的优秀算法。什么是欧拉序举个例子,下面是一棵树:上面有 dfs 与回溯的过程。将整个 dfs 与回溯过程写出来:1  →  2......
  • 基于dfn序的O(nlogn)-O(1) lca
    \(dfn\)序的长度是欧拉序的一半,常数较小,并且代码便于理解背诵。让欧拉序求lca成为时代的眼泪。代码部分实现思路来自cqbz_dongjie点击查看代码autominlca=[&](intx,inty){return(dfn[x]<dfn[y])?x:y;};intt=std::__lg(n)+1;std::vector<std::vect......