代码编织梦想

//最近公共祖先
//暴力做法 
//向上标记法和同步前进法 
int LCA(int u,int v)
{
	if(u == v)return u;
	flag[u] = 1;
	while(fa[u] != u)//u向上走到根 
	{
		u = fa[u];
		flag[u] = 1;
	}
	if(flag[v])return v;
	while(fa[v] != v)
	{
		v = fa[v];
		if(flag[v])return v;
	}
	return 0;
 } 
 //树上倍增
 //方法:创建ST表,利用ST表求解LCA
 //f(i,j) = f(f(i,j-1),j-1); 
 
void ST_create()
{
 	for(int j = 1;j <= k;j++)
 	for(int i = 1;i <= n;i++)//表示i先走2 ^ (j-1)步到达f[i][j-1],再走2 ^ (j-1)步 
 	f[i][j] = f[f[i][j-1]][j-1];
}

int LCA_ST_query(int x,int y)
{
	if(d[x] > d[y]) swap(d[x],d[y]);// 保证x的深度小于等于y 
	for(int i = k;i >= 0;i--) if(d[f[y][i]] >= d[x]) y = f[y][i];//y向上走到与x同一深度 
	
	if(x == y) return x;
	for(int i = k;i >= 0;i--) 
	if(f[x][i] != f[y][i]) x = f[x][i],y = f[y][i];
	return f[x][0];//返回x的父亲 
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Demilly123/article/details/128008579

【C++】最近公共祖先 LCA-爱代码爱编程

最近公共祖先 百科名片简单引入LCA的算法暴力枚举法Tarjan离线算法倍增算法例题:题目描述输入描述输出描述样例输入样例输出代码 百科名片 最近公共祖先Lowest Common AncestorsLCA简单引入 对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u、v的祖先且x的深度尽可能大。 红色的

最近公共祖先LCA问题-爱代码爱编程

题目描述 给定两个int a,b。给定节点编号,请返回a和b的最近公共祖先的编号。 思路:利用父子节点之间的关系 **root=child/2;**让a,b之间的较大数一直除2,同时让a,b往上走,直到a==b,就找到了公共祖先 代码实现 import java.util.*; public class LCA { public

最近公共祖先LCA-爱代码爱编程

最近公共祖先(Lowest Common Ancestors,LCA)指有根树中距离两个节点最近的公共祖先。祖先指从当前节点到树根路径上的所有节点。 u和v的公共祖先指一个节点既是u的祖先,又是v的祖先。u和v的最近公共祖先指距离u和v最近的公共祖先。若v是u的祖先,则u和v的最近公共祖先是v。      可以使用LCA求解树上任意两点之间的

最近公共祖先LCA倍增算法-爱代码爱编程

LCA定义 LCA(Least Common Ancestors):最近公共祖先即两个结点最近的公共祖先 由上图可以看到 5号结点和7号结点的LCA为3号结点,9号结点和7号结点的LCA为7号结点。 一般算法 首先可以将两个结点统一到相同深度,然后一起向上一步一步走,直到他们踩到相同点,则该点为他们的LCA 。 (

【图论】—— 最近公共祖先(lca)_玄澈_的博客-爱代码爱编程

给定一颗树,若节点 z 既是 节点 x 的祖先, 也是节点 y 的祖先,那么称 z 为 x、y 的公共祖先。 在 x、y 的所有公共祖先中,深度最大的一个称为 x、y 的最近公共祖先, 也称 LCA(x, y) LCA(x, y) 是 x 到根的路径与 y 到根的路径的交汇点。它也是 x 与 y 之间的路径上深度最小的节点。 树上倍增法

最近公共祖先lca的三种求法_litian355的博客-爱代码爱编程

最近公共祖先的定义:如果结点c满足: 目录 1.向上标记法 2.倍增算法 3.用离线的tarjan算法求LCA 时间复杂度O(n+m)          1172. 祖孙询问 1171. 距离 1.c是a和b的公共祖宗结点。 2.c是距离a,b最近的公共祖宗节点。 那么就称c是a和b的最近公共祖先。 1.向上标记法 分别从a,

图论--最近公共祖先lca_信奥教练andy的博客-爱代码爱编程

最近公共祖先LCA LCA(Least Common Ancestors),即最近公共祖先,是指这样一个问题:在有根树中,找出某两个结点u和v最近的公共祖先(另一种说法,离树根最远的公共祖先) 最近公共祖先是相对于两个节点来说的,一般来说,最近公共祖先为节点 u和节点 v的最近的公共祖先。若 u 为 v 的祖先或者 v 为 u 的祖先,则LCA(u,v

`算法知识` 最近公共祖先lca_苏丕谟的博客-爱代码爱编程

catalog LCA算法倍增代码 LCA 对于一棵树 (可以是多叉树), 根为R 祖先 对于任意一个点x, 该点到R的 简单路径 (也就是从x一直往上走到R的路径)上的所有点 均是x的 祖先.

最近公共祖先lca 倍增法_brokenrivers的博客-爱代码爱编程

 之前学习了Tanjan求LCA的解法, 最近公共祖先(LCA)Tarjan_Brokenrivers的博客-CSDN博客 这次学习一下倍增法 倍增基于一个常识,任何一个数都能表示为2的幂之和的形式如 9=2^3+2^0=1001 也就是二进制的形式,基于此,对于线性的过程,则可以通过2^x的跳跃实现log级别的复杂度。 最暴力的LCA做法就是手

最近公共祖先 lca_chengqiuming的博客-爱代码爱编程

一 点睛  最近公共祖先指有根树中距离两个节点最近的公共祖先。祖先指从当前节点到树根路径上的所有节点。 u 和 v 的公共祖先指一个节点既是 u 的祖先又是 v 的祖先,u 和 v 的最近公共祖先指距离 u 和 v 最近的公共祖先。若 v 是 u 的祖先,则 u 和 v 的公共祖先是 v。 可以使用 LCA 求解树长任意两点之间的距离,求 u 和

c语言百日千题系列之《忘情水题》第一日_会敲代码的史蒂夫.的博客-爱代码爱编程

目录 绪论 1.最大数位置 2.与指定数字相同的数的个数 3.蓝桥杯2013年第四届真题-核桃的数量 4.求所给范围内水仙花数并排列 5.最大值和最小值的差 6.计算书费 7.角谷猜想 8. 最高的分数 9.年龄与疾病 10.-百钱百鸡问题 绪论       本文是C语言百日千题系列《忘情水题》的第一篇专栏文章,主要为初学

第五章《类的继承》第3节:方法的重写_穆哥学堂的博客-爱代码爱编程

重写是子类对父类方法的实现过程进行重新编写。重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。 5.3.1方法重写的意义及实现方式 从理论上来讲,子类能够继承父类的所有属性和方法。当子类继承了父类的某个方法后,如果发现这个方法并不适合自己,或者是这个方法的算法效率较低,那么对于子类来说,这个从父类继承而来的

2022大厂面试秘籍java岗:中间件+算法+http+线程+虚拟机+分布式_啊码的博客-爱代码爱编程

前言 很多朋友对面试不够了解,不知道如何准备,对面试环节的设置以及目的不够了解,因此成功率不高。通常情况下校招生面试的成功率低于1%,而社招的面试成功率也低于5%,所以对于候选人一定要知道设立面试的初衷以及每个环节的意义,

期末复习 c语言再学习_aniyaaaaa_的博客-爱代码爱编程

作者:@小萌新 专栏:@C语言复习 作者简介: 大二学生 希望能和大家一起进步! 本篇博客简介:回顾之前的分支循环以及一些题目博客 @[TOC](这里写目录标题 分支循环选择switch caseget

【csdn竞赛】第十期解题报告_icehomegre的博客-爱代码爱编程

文章目录 感想关于自己关于平台 第一题 (难度:入门)题目描述100分做法 第二题 (难度:简单)题目描述100分做法 第三题 (难度:中等/困难)题目描述100分做法1(对应中等)10