首页 > 其他分享 >最近公共祖先 学习笔记

最近公共祖先 学习笔记

时间:2024-04-14 10:45:15浏览次数:11  
标签:__ dep return fa 祖先 lca 笔记 int 公共

概念

一棵有根树,求两个点的最近公共祖先。

方法

1. 倍增法:\(O(n)-O(\log n)\)

int lca(int x,int y) {
	if(dep[x]<dep[y]) swap(x,y);
	while(dep[x]>dep[y]) x=fa[x][__lg(dep[x]-dep[y])-1];
	if(x==y) return x;
	for(int k=__lg(dep[x])-1; ~k; k--)
		if(fa[x][k]!=fa[y][k]) x=fa[x][k],y=fa[y][k];
	return fa[x][0];
}

2. dfs 序求 lca:\(O(n\log n)-O(1)\)

int get(int x,int y) {return dfn[x]<dfn[y]?x:y;}
void dfs(int x,int fa) {
    st[dfn[x]=++cnt][0]=fa;
    st[1][1]=fa;
    for(auto y:e[x]) if(y!=fa) dfs(y,x);
}
void build_st() {
    int k=__lg(n);
    for(int i=1; i<=k; i++)
        for(int j=1; j+(1<<i)-1<=n; j++)
            st[j][i]=get(st[j][i-1],st[j+(1<<(i-1))][i-1]);
}
int lca(int x,int y) {
    if(x==y) return x;
    if((x=dfn[x])>(y=dfn[y])) swap(x,y);
    int k=__lg(y-x++);
    return get(st[x][k],st[y-(1<<k)+1][k]);
}

3. 树剖求 lca:\(O(n)-O(\log n)\)

int lca(int x,int y) {
	while(top[x]^top[y]) {
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		x=fa[top[x]];
	}
	return dep[x]<dep[y]?x:y;
}

标签:__,dep,return,fa,祖先,lca,笔记,int,公共
From: https://www.cnblogs.com/lgh-blog/p/18133844

相关文章

  • 《线性代数的本质》笔记(01-03)
    前言:本系列为《线性代数的本质》的笔记,作者为3Blue1Brown大神,视频的b站链接为https://www.bilibili.com/video/BV1ys411472E/?spm_id_from=333.999.0.0&vd_source=cb7d5dd830bc59a85c459b0b14a2e685看了这个系列视频后我受益匪浅,为了方便后续回顾所以整理成了文字资料。我强烈......
  • 读所罗门的密码笔记19_治理模式
    1. 解决方案1.1. 全球人工智能的环境错综复杂,它严重依赖于价值观,且关系重大1.2. 即使是与大家同仇敌忾的问题做斗争,也往往无法在国际社会中取得最佳效果1.3. OPCW(禁止化学武器组织)已经帮助限制了化学武器的开发和部署,但没有协议是百分百奏效的1.4. 如果《核不扩散条约》......
  • Splay 学习笔记
    为了LCT制造了一个Splay……Splay还是一种二叉排序树。我们想让他支持查询结点,删除结点等等。但是普通BST复杂度难以保证,于是Splay出现了。【引入】Splay的思想和并查集的路径压缩类似。并查集的路径压缩允许出现一两次复杂度高的操作,但是经历过一次后就不会再有第二......
  • 《自动机理论、语言和计算导论》阅读笔记:p139-p171
    《自动机理论、语言和计算导论》学习第7天,p139-p171总结,总计33页。一、技术总结1.reversalp139,Thereversalofastringa1a2...anisthestringwrittenbackwards,thatisanan-1...a1.2.homomorphismAstringhomomorphismisafunctiononstringsthatwokrs......
  • [笔记]数位dp例题及详解-下
    【接上回】-数位dp例题及详解-上共\(4\)道难度较高、较有思考性的题。附上数位dp题单:https://www.luogu.com.cn/training/494976#problems小小的总述:数位dp是这样的,状态表示越简洁,dp数组越小巧,进而时空消耗就越少。所以我们刷题的时候,可以先无脑把\(f\)数组的每一维都设为与......
  • Spring学习笔记
    一、Spring启示录阅读以下代码:packagecom.powernode.oa.controller;importcom.powernode.oa.service.UserService;importcom.powernode.oa.service.impl.UserServiceImpl;publicclassUserController{privateUserServiceuserService=newUserServiceImpl();......
  • Living-Dream 系列笔记 第53期
    妙妙题大合集。T1令\(dp_{i,j}\)表示分离出以\(i\)为根的恰含\(j\)节点的树所需的最小删边数。有初始状态\(dp_{i,1}=\)其子节点个数,其余为\(\infty\)。对于答案,我们考虑到对于每个节点\(i\),除了其子树内的删边数之外,它的父节点与它的连边也应删去(注意根节点\(root......
  • 有限元方法[Matlab]-笔记
    <<MATLABCodesforFiniteElementAnalysis-SolidsandStructures(Ferreira)>>笔记chapter01matlabbasic略第二章:离散系统笔记、例题Matlab代码problem1.m%MATLABcodesforFiniteElementAnalysis%Problem1:3springsproblem%clearme......
  • 多项式学习笔记
    1.前置知识1.1基础\(f(x)=\sum_{i=0}^na_ix^i\)被称为一个\(n\)次多项式。\(\degf(x)\)表示多项式的次数。\(f(x)g(x)=h(x)\)称为多项式乘法,也叫多项式卷积,满足\(h_n=\sum_{i+j=n}f_ig_j\)。1.2点值给定一个多项式\(f(x)\),再给\(m\)个点\(x_1,\dot......
  • [学习笔记] 树上差分 - 图论
    前置知识:树,LCA,前缀和与差分边差分这个名字是在网上看到的,不理解为什么要叫这么一个名字,可能是因为它与树链修改有关。当然,用于树链修改单点查询非常方便~看这个图,该图是以点1为根进行DFS的。如果我们要把从3->4这条树链上所有的点统统加上1,可以都转化为对到根节点的......