最近公共祖先(LCA)笔记

news/2024/12/23 13:13:01/文章来源:https://www.cnblogs.com/yingxilin/p/18623744

最近公共祖先(LCA)笔记

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

题目入口

题目描述

如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。

输入格式

第一行包含三个正整数 \(N,M,S\),分别表示树的结点个数、询问的个数和树根结点的序号。

接下来 \(N-1\) 行每行包含两个正整数 \(x, y\),表示 \(x\) 结点和 \(y\) 结点之间有一条直接连接的边(数据保证可以构成树)。

接下来 \(M\) 行每行包含两个正整数 \(a, b\),表示询问 \(a\) 结点和 \(b\) 结点的最近公共祖先。

输出格式

输出包含 \(M\) 行,每行包含一个正整数,依次为每一个询问的结果。

样例 #1

样例输入 #1

5 5 4
3 1
2 4
5 1
1 4
2 4
3 2
3 5
1 2
4 5
样例输出 #1
4
4
1
4
4

提示

对于 \(30\%\) 的数据,\(N\leq 10\)\(M\leq 10\)

对于 \(70\%\) 的数据,\(N\leq 10000\)\(M\leq 10000\)

对于 \(100\%\) 的数据,\(1 \leq N,M\leq 500000\)\(1 \leq x, y,a ,b \leq N\)不保证 \(a \neq b\)

样例说明:

该树结构如下:

第一次询问:\(2, 4\) 的最近公共祖先,故为 \(4\)

第二次询问:\(3, 2\) 的最近公共祖先,故为 \(4\)

第三次询问:\(3, 5\) 的最近公共祖先,故为 \(1\)

第四次询问:\(1, 2\) 的最近公共祖先,故为 \(4\)

第五次询问:\(4, 5\) 的最近公共祖先,故为 \(4\)

故输出依次为 \(4, 4, 1, 4, 4\)

2021/10/4 数据更新 @fstqwq:应要求加了两组数据卡掉了暴力跳。


大致思路

就原本是两个点一步一步往上跳直到跳到同一点上。优化的方法是根据两个节点的的深度,如不同,向上调整深度大的节点,使得两个节点在同一层上,如果正好是祖先,结束;否则,将两个节点同时上移,查询最近公共祖先(两个过程均使用倍增加速)。

code

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,m,rt;
vector<int>g[N];
int read()
{int x=0,f=1;char c=getchar();while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();return x*f;
}
int f[N][21];//f[i][j] 结点i往上跳2^j步的祖先结点
//f[i][j]=f[f[i][j-1]][j-1]
int d[N];//d[i] 结点i处于第几层
void dfs(int u,int fa)
{f[u][0]=fa;for(int i=0;i<(int)g[u].size();i++){int v=g[u][i];if(v==fa) continue;d[v]=d[u]+1;dfs(v,u);}
}
int get_lca(int x,int y)
{//d[x]>d[y]if(d[x]<d[y]) swap(x,y);int cha=d[x]-d[y];for(int i=20;i>=0;i--)if(cha>>i&1) x=f[x][i];//x和y处于同一层if(x==y) return x;for(int i=20;i>=0;i--)if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];return f[x][0];
}
int main()
{n=read();m=read();rt=read();for(int i=1;i<n;i++) {int x=read(),y=read();g[x].push_back(y);g[y].push_back(x);}d[rt]=1;dfs(rt,rt);for(int j=1;j<=20;j++)for(int i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1];while(m--){int x=read(),y=read();printf("%d\n",get_lca(x,y));}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/857425.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows 网络安全系统框架环境搭建

网络安全虚拟机框架环境搭建操作系统Vmware Workstation (17.5.2 build-23775571) Windows 11 300G硬盘空间(C、D、E) 8G内存 分三个盘,其中D盘用于安装软件、E盘用于工作Win11 跳过联网激活 shift+F10 或Fn+shift+F10 打开cmd窗口,执行oobe\bypassNRO,系统自动重启后即…

【日记】昨天才找到的头绳,今天就不小心给洗了(947 字)

正文前些周有个周末研究了一天的护发素(虽然现在已经忘光了),今天研究了半天到一天的沐浴露(所以打算写点什么记下来,免得又忘了)。研究完了之后,发现母亲原来给我买的那瓶沐浴露,是把能踩得雷都踩了一遍……甲基氯异噻唑啉酮(CMIT)和甲基异噻唑啉酮(MIT)都有,不过…

【Java编程】定时任务实现原理详解

一、摘要 在很多业务的系统中,我们常常需要定时的执行一些任务,例如定时发短信、定时变更数据、定时发起促销活动等等。 在上篇文章中,我们简单的介绍了定时任务的使用方式,不同的架构对应的解决方案也有所不同,总结起来主要分单机和分布式两大类,本文会重点分析下单机的…

manim边学边做--移动动画

在Manim中,其实直线移动的动画非常简单,每个Mobject对象都有animate属性, 通过obj.animate.shift()或者obj.animate.move_to()很容易将对象从一个位置移往另一个位置。 不过,如果要更复杂的移动路线,那么animate属性的移动方法就无法满足了。 本篇介绍Manim中的两个处理复…

科来网络分析系统:国产网络数据包分析工具推荐

wireshark作为数据分析过程中必备的工具,深受好评。但是其使用起来有一定的门槛,本文介绍的:科来网络分析系统(技术交流版)。在某些方面相比于wireshark更有优势。附数据包分析案例 1、下载安装: 登录官网 https://www.colasoft.com.cn/downloads/capsa2、启动3、选择工作…

PDF转换工具Marker、MinerU、Markitdown对比分析

1 文件格式插件MarkerMinerUMarkitdownmagic-pdfmagic-doc支持的文件格式PDF、EPUB 和 MOBIPDFPPT、PPTX、DOC、DOCX、PDFPDF, PowerPoint, Word, Excel Images (EXIF metadata and OCR), Audio (EXIF metadata and speech transcription), HTML, CSV, JSON, XML, ZIP f…

【附源码】JAVA在线拍卖系统+SpringBoot+VUE+前后端分离

学弟,学妹好,我是爱学习的学姐,今天带来一款优秀的项目:在线拍卖系统 。 本文介绍了系统功能与部署安装步骤,如果您有任何问题,也请联系学姐,偶现在是经验丰富的程序员! 一. 系统演示 管理后台-截图拍卖前端-截图视频演示 https://githubs.xyz/show/307.mp4 二. 系统概…

PostgreSQL 的历史

title: PostgreSQL 的历史 date: 2024/12/23 updated: 2024/12/23 author: cmdragon excerpt: PostgreSQL 是一款功能强大且广泛使用的开源关系型数据库管理系统。其历史可以追溯到1986年,当时由加州大学伯克利分校的一个研究团队开发。文章将深入探讨 PostgreSQL 的起源、发…

【社工钓鱼】手法总结

1479394864616213 七芒星实验室 2024年12月23日 07:03 四川 一、rlo文件名翻转 简介:全名Right-to-Left Override,本质是一串Unicode字符,编码0x202E,本身不可见,插入之后会让在他之后的字符串从右往左重新排列,本意是用来支持一些从右往左写的语言的文字,比如阿拉伯语、…

docker环境利用centos7镜像 + miniconda + python3.9 + wkhtmltopdf 构建html转图片服务

1、目录结构 html2image ——Dockerfile ——main.py ——requirements.txt 2、Dockerfile FROM centos:7WORKDIR /app COPY . /app/RUN curl -O https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox-0.12.6-1.centos7.x86_64.rpm \&& cur…

Java 项目实战:基于 Spring Boot 与 Vue.js 技术构建护士排班管理系统的架构设计方案

一、引言 1.1 项目背景 随着医疗行业的不断发展,医院护士排班管理的复杂性日益增加。传统的手工排班方式难以满足高效、公平、合理的需求,容易出现人力分配不均、员工满意度低等问题。为了提高护士排班的科学性和管理效率,特开发此护士排班管理系统。 1.2 项目目标 本系统旨…