LCA(最近公共祖先)

LCA(Lowest Common Ancesto) 就是今天的主角,又叫最近公共祖先,用来求两个节点的最小父节点。

1.简介

LCA算法是一种倍增算法,分为3个步骤:遍历深度与父节点、倍增初始化和LCA主函数

2.代码

1.遍历深度与父节点(附main函数调用方式)

int n, m, s, f[100005][33],dep[100005];//倍增数组和深度数组
vector<int> a[500005];//结点vector

void dfs(int u, int fa){
	f[u][0] = fa;
    dep[u] = dep[fa]+1;
    
    for (int i = 0; i < a[u].size(); i++){
    	if (fa != a[u][i]) dfs(a[u][i], u);
    }
}

//主函数
dfs(0, 0);

2.倍增初始化

void init(){
	for (int j = 1; (1 << j) <= n; j++){
    	for (int i = 1; i <= n; i++) f[i][j] = f[f[i][j-1]][j-1];
    }
}

3.LCA主函数

int LCA(int u, int v){
	if (dep[u] < dep[v]) swap(u, v);
    
    for (int i = 22; i >= 0; i--){
    	if (dep[f[u][i]] >= dep[v]) u = f[u][i];
    }
 	
    if (u == v) return u;
    
    for (int i = 22; i >= 0; i--){
    	if (f[u][i] != f[v][i]){
        	u = f[u][i];
            v = f[v][i];
        }
    }
    
    return f[u][0];
}

这就是LCA的全部了,点个赞再走呗。

c++算法大全 文章被收录于专栏

本专栏收集了c++大部分基础算法,附有简介和代码。

全部评论

相关推荐

饿魔:去不了大厂,总有能去的地方,不知道焦虑什么
点赞 评论 收藏
分享
1️⃣关于公司🦊的工作氛围超级好,9:00-9:30弹性打卡,晚6:00-6:30下班,午休1h,但我们那片都休2h哈哈,不用加班!不用加班!加班也没活给你干,没有dirty&nbsp;work,不打杂不拿外卖不取快递,煮波已经在管四个平台的官号了,也是好起来了…还做了很多策划,马上要有自己的数据新闻啦~2️⃣关于吃饭搜狐没有自己的食堂,B1可以买到包子、玉米、咖啡等等,可以解决早餐,附近有很多餐厅,不过不太适合一人食,B1直通融科,可以去探索探索,也可以点外卖,最近外卖大战尊嘟好便宜~外卖可以拿到B1或者茶水间吃,完全不用担心没有好吃的。还有一个我真的震惊,偶尔会有组里聚餐,氛围真的真的超级好,还会一起玩狼人杀,I&nbsp;like~3️⃣关于体验真的没得说,茶水间有茶和咖啡,早上泡一杯花茶感觉整个工位都香香嘟,偶尔还会有明星来扫楼,谁懂!实习第一周就遇到了王以太来扫楼,我说你们这些明星都来都来!今天还刚领了电脑,这里就不得不夸一下我🦊的工作效率,不到2h审核通过了,怪不得你不加班……4️⃣关于投递我是在公众号上面投的,当天就给我打了电话约了下午的面试,面试结束就发了笔试,笔试内容和你工作内容相关性非常强,如果想知道自己以后会干什么可以参考笔试题,笔试题目不多,给的时间也比较长,不用太担心🤗5⃣️面试经验感觉🦊的面试并不像考试,倒像是交流和碰撞,做内容岗的需要对近期的社会热点有自己的理解和独特切口,可以不全面,甚至可以非常幼稚,但是不人云亦云就可以啦~面试之前mt会发一些组里最近在做的项目供参考,面试的问题也是比较简单的,和工作内容真的强相关(后知后觉,面试之前可以先看看往期内容,构思一下自己比较想做的选题和最近关注的社会热点,内容岗最好想一下选题具体怎么开展,每个部分写些什么,整体节奏也非常轻松,问啥答啥、放轻松就好啦~下周继续上班💼
投递北京搜狐互联网信息服务有限公司等公司10个岗位
点赞 评论 收藏
分享
评论
2
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务