基于c++的LCA倍增法实现
原理就不写了,自己找b站视频学习
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAXN = 100005; // 最大节点数
const int MAXLOG = 20; // 最大对数深度
vector<int> tree[MAXN]; // 树的邻接表表示
int depth[MAXN]; // 每个节点的深度
int parent[MAXN][MAXLOG]; // parent[i][j]表示节点i的2^j级祖先
// DFS预处理每个节点的深度和父节点信息
void dfs(int u, int p) {
parent[u][0] = p; // 直接父节点
for (int i = 1; i < MAXLOG; ++i) {
parent[u][i] = parent[parent[u][i-1]][i-1];
}
for (int v : tree[u]) {
if (v != p) {
depth[v] = depth[u] + 1;
dfs(v, u);
}
}
}
// 初始化,从根节点开始预处理
void init(int root, int n) {
depth[root] = 0;
dfs(root, -1); // 根节点的父节点设为-1
}
// 查询u和v的LCA
int lca(int u, int v) {
// 确保u是较深的节点
if (depth[u] < depth[v]) {
swap(u, v);
}
// 将u提升到与v同一深度
for (int i = MAXLOG - 1; i >= 0; --i) {
if (depth[u] - (1 << i) >= depth[v]) {
u = parent[u][i];
}
}
// 如果此时u和v相同,则v就是LCA
if (u == v) {
return u;
}
// 同时提升u和v直到它们的父节点相同
for (int i = MAXLOG - 1; i >= 0; --i) {
if (parent[u][i] != -1 && parent[u][i] != parent[v][i]) {
u = parent[u][i];
v = parent[v][i];
}
}
// 返回LCA
return parent[u][0];
}
int main() {
int n; // 节点数
cin >> n;
// 构建树
for (int i = 0; i < n - 1; ++i) {
int u, v;
cin >> u >> v;
tree[u].push_back(v);
tree[v].push_back(u);
}
int root = 1; // 假设根节点是1
init(root, n);
// 查询示例
int q; // 查询次数
cin >> q;
while (q--) {
int u, v;
cin >> u >> v;
cout << "LCA of " << u << " and " << v << " is: " << lca(u, v) << endl;
}
return 0;
}
解释DFS遍历部分的代码
这段代码是深度优先搜索(DFS)遍历树的递归实现部分,用于预处理每个节点的深度和倍增祖先信息。让我详细解释一下:
cpp
复制
下载
for (int v : tree[u]) {if (v != p) {depth[v] = depth[u] + 1;dfs(v, u);} }
代码分解:
-
for (int v : tree[u])
:-
这是一个范围for循环,遍历节点
u
的所有邻接节点v
-
tree[u]
是存储节点u
所有子节点的容器(通常是vector)
-
-
if (v != p)
:-
检查当前邻接节点
v
是否不是父节点p
(避免回溯到父节点) -
这是树遍历的关键,确保我们不会无限循环(因为树是无向图,但遍历时要当作有向图处理)
-
-
depth[v] = depth[u] + 1
:-
设置子节点
v
的深度为父节点u
的深度+1 -
这样递归计算所有节点的深度
-
-
dfs(v, u)
:-
递归调用DFS,处理子节点
v
-
这里
u
作为v
的父节点传入下一层递归
-
下面再解释解释这段代码
for (int i = MAXLOG - 1; i >= 0; --i) {if (depth[u] - (1 << i) >= depth[v]) {u = parent[u][i];} }
代码分解:
-
for (int i = MAXLOG - 1; i >= 0; --i)
:-
从最大的可能步长开始尝试(MAXLOG-1),逐步减小到0
-
这是倍增法的典型模式:先尝试大跨度跳跃,再逐步细化
-
-
1 << i
:-
这是位运算,表示2的i次方(即2^i)
-
例如:
1<<3
= 8,1<<0
= 1 -
这里表示尝试向上跳跃2^i个层级
-
-
depth[u] - (1 << i) >= depth[v]
:-
检查如果
u
向上跳2^i层后,深度是否仍然不小于v
的深度 -
确保跳跃后不会"跳过"目标深度
-
-
u = parent[u][i]
:-
如果条件满足,将
u
更新为其2^i级祖先 -
这是实际执行跳跃的操作
-
为什么这样工作?
倍增法的核心思想是:任何整数都可以表示为2的幂次的和。例如:
-
5 = 4 + 1
-
7 = 4 + 2 + 1
-
10 = 8 + 2
从最大的可能步长开始尝试,可以确保:
-
每次跳跃都是尽可能大的安全步长
-
总能在O(logN)时间内完成调整
示例说明:
假设:
-
depth[u] = 10
,depth[v] = 5
-
MAXLOG = 5
(最大能表示2^4=16层跳跃)
循环执行过程:
-
i=4: 尝试跳16层 → 10-16 <5 → 不跳
-
i=3: 尝试跳8层 → 10-8=2 <5 → 不跳
-
i=2: 尝试跳4层 → 10-4=6 ≥5 → 跳,u=parent[u][2], depth=6
-
i=1: 尝试跳2层 → 6-2=4 <5 → 不跳
-
i=0: 尝试跳1层 → 6-1=5 ≥5 → 跳,u=parent[u][0], depth=5
最终u的深度从10调整到5,与v同深度。
关键点:
-
1<<i
实现了高效的2^i计算 -
从大到小的尝试顺序确保跳跃效率
-
这种方法的时间复杂度是O(logN),N是树的高度
这段代码是LCA算法中调整节点深度的关键部分,体现了倍增法的精髓。
相关文章:
基于c++的LCA倍增法实现
原理就不写了,自己找b站视频学习 #include <iostream> #include <vector> #include <cmath> #include <algorithm> using namespace std; const int MAXN 100005; // 最大节点数 const int MAXLOG 20; // 最大对数深度 vector<…...
探索大语言模型(LLM):语言模型从海量文本中无师自通
文章目录 引言:当语言模型学会“自己教自己”一、自监督学习:从“无标签”中挖掘“有监督”信号二、语言模型的自监督训练范式:两大经典路径1. 掩码语言模型(Masked Language Modeling, MLM)——以BERT为例2. 自回归语…...
大语言模型 - 运行、微调的显存计算详解与优化 全量微调、LoRA 优化策略
写在前面 随着Transformer架构的大语言模型(LLM)不断发展,其参数规模也在迅速增加。无论是进行模型推理还是微调训练,GPU显存消耗都是开发和应用LLM时的重要考量。本文将详细探讨大模型运行(推理)与微调时…...
【音视频】视频解码实战
FFmpeg流程 从本地读取YUV数据编码为h264格式的数据,然后再存⼊到本地,编码后的数据有带startcode与FFmpeg 示例⾳频编码的流程基本⼀致。 函数说明 avcodec_find_encoder_by_name:根据指定的编码器名称查找注册的编码器。avcodec_alloc_co…...
计算机网络学习笔记 4-6章
第 4 章 网络层 【考纲内容】 (一)网络层的功能 异构网络互连;路由与转发;SDN 基本概念;拥塞控制 (二)路由算法 静态路由与动态路由;距离 - 向量路由算法࿱…...
游戏哪些接口会暴露源IP?_深度解析服务器通信安全隐患
一、用户认证体系中的IP泄露陷阱 在游戏登录验证环节,采用明文传输的HTTP协议接口会将客户端IP直接暴露在TCP握手阶段。某头部MOBA游戏曾因使用HTTP Basic认证方式,导致黑客通过抓取三次握手数据包获取服务器真实IP。游戏行业权威测试显示,使…...
树莓派学习专题<11>:使用V4L2驱动获取摄像头数据--启动/停止数据流,数据捕获,缓存释放
树莓派学习专题<11>:使用V4L2驱动获取摄像头数据--启动/停止数据流,数据捕获,缓存释放 1. 启动和停止数据流2. 捕获数据3. 释放缓存 1. 启动和停止数据流 使用命令 VIDIOC_STREAMON 启动摄像头数据流,使用…...
adb push 报错:CreateProcess failure, error 123
客户使用adb push 可执行程序的时候报错如下所示 原因:文件目录里边带中文导致 解决方法:将文件目录里中文改成英文就好了...
【实战篇】数字化打印——打印格式设计器的功能说明
前言 myBuilder内置了覆盖丰富场景的打印格式设计器,效果统一,功能完善。 设计器一:小票 用于设计小票、水单等滚筒纸张的场景,例如:超市购物小票 主要功能 打印格式的保存、下载、上传设计时功能:撤销…...
【数据挖掘】时间序列预测-时间序列预测策略
时间序列预测策略 (1)单步预测与多步预测(2)直接多步预测(3)递归多步预测(4)直接递归的混合预测(5)多输入多输出预测 (1)单步预测与多…...
京东商品详情数据爬取难度分析与解决方案
在当今数字化商业时代,电商数据对于市场分析、竞品研究、价格监控等诸多领域有着不可估量的价值。京东,作为国内首屈一指的电商巨头,其商品详情页蕴含着海量且极具价值的数据,涵盖商品价格、库存、规格、用户评价等关键信息。然而…...
【Linux】线程
一.线程概念 我们在学习进程的时候已经知道了,进程内核数据结构pcb自己的代码和数据。那么单单一个task_struct是什么呢? 我们将单个的task_struct叫做轻量级进程,而这个轻量级进程也叫做线程。以往我们在了解进程的时候,一个进…...
WPF-遵循MVVM框架创建图表的显示【保姆级】
文章速览 1、技术栈实现步骤1、创建WPF工程项目2、引入框架 Caliburn.Micro、数据可视化库ScottPlot.WPF3、创建文件夹,并创建相应的View & ViewModel4、创建启动类5、将启动类设置为启动项6、编写View7、编写VM8、将VM和View中的图表进行绑定9、备注 示例效果 …...
深入详解人工智能数学基础—概率论-KL散度在变分自编码器(VAE)中的应用
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…...
《代码整洁之道》第9章 单元测试 - 笔记
测试驱动开发 (TDD) 是一种编写整洁代码的“规程”或“方法论”,而不仅仅是测试技术。 JaCoCo 在运行测试后生成详细的覆盖率报告的工具, maven 引用。 测试驱动开发 测试驱动开发(TDD)是什么? TDD 不是说写完代码…...
每日c/c++题 备战蓝桥杯(P2392 kkksc03考前临时抱佛脚)
【题解】期末考试抱佛脚最短时间(动态规划 | 二进制背包) 题目链接 题目背景 kkksc03 的大学生活非常颓废,临近期末考试才开始疯狂复习。他有 4 门科目需要复习,每一科都有若干道题目,每道题目需要一定的时间完成。…...
徽客松S1 | 合肥首场 AI 黑客松招募
越来越多的黑客松在各个城市出现!5 月 10 日,合肥,12 小时极速挑战。 我们和本次「徽客松」发起人 SDL 也是在一个黑客松上相识。当你的城市还没有黑客松可参加,与其等待,不如学习 SDL,自己发起一个&#…...
单片机-89C51部分:6、按键
飞书文档https://x509p6c8to.feishu.cn/wiki/EtkHw8MG0ipz3NkHlZEcwpEnn4g 一、应用场景: 轻触开关、按键、电容开关、光栅传感器、微动、关电开关 二、原理: 轻触按键可以理解为两根导线,按下时导线连接,松开时导线断开。我们可…...
小结: DHCP
交换机的物理接口分批地址池、全局分配地址池 分批地址池(接口地址池/局部分配) 按物理接口(如 VLAN 接口、SVI、物理端口)划分,每个接口单独配置一个小型地址池。适合规模较小、子网划分清晰的场景。配置方法示例&…...
matlab simulink中理想变压激磁电流容易有直流偏置的原因分析。
simulink把线性变压器模块拉出来,设置没有绕线电阻的变压器,激磁电感和Rm都有,然后给一个50%占空比的方波,幅值正负10V,线路中设置一个电阻,模拟导线阻抗。通过示波器观察激磁电流,发现电阻越小…...
国产三维CAD皇冠CAD在「通用设备制造业」建模教程:台式起重机
在制造业数字化转型的浪潮中,三维CAD软件已成为装备设计的核心工具,而国产软件的崛起正悄然改变行业格局。皇冠CAD(CrownCAD)作为中国自主研发的云端三维CAD平台,凭借全栈可控的底层架构、高效协同的设计流程及复杂场景…...
Day 12
文件操作 文件文件操作文件函数课堂笔记 文件 1)概述 FILE 所有平台的名字都一样,FILE 是一个结构体类型,里面的成员功能一样,不同平台成员的名字不一样。 FILE *fp 1、fp指针,只用调用了fopen().在堆区分配空间,把地址返回给fp 2、fp指针…...
Lua 第11部分 小插曲:出现频率最高的单词
在本章中,我们要开发一个读取并输出一段文本中出现频率最高的单词的程序。像之前的小插曲一样,本章的程序也十分简单但是也使用了诸如迭代器和匿名函数这样的高级特性。 该程序的主要数据结构是一个记录文本中出现的每一个单词及其出现次数之间关系的表。…...
自然语言处理之机器翻译:注意力机制在低资源翻译中的突破与哲思
## 被忽视的7000种语言 在人工智能翻译技术突飞猛进的今天,一个残酷的事实被刻意掩盖:全球7000种语言中,超过95%缺乏构建现代机器翻译系统所需的基础资源。当我们在庆贺Transformer模型将英德翻译BLEU值推高至40%时,那些承载着人类文明基因的少数民族语言,正在经历着前所未…...
SQL 处理重复数据之技巧(Techniques for Handling Duplicate Data with SQL)
SQL 处理重复数据之技巧 ❝ 在日常数据库操作中,我们经常会遇到重复数据的问题。重复数据不仅会占用存储空间,还可能导致数据分析结果不准确。本文将详细讲解 SQL 中处理重复数据的常用方法,帮助你更高效地管理数据库中的数据。 一、为什么会…...
Redis01-基础-入门
零、文章目录 Redis01-基础-入门 1、认识 NoSQL NoSQL 知识请参考:https://blog.csdn.net/liyou123456789/article/details/132612444 2、认识 Redis (1)简介 Redis(Remote Dictionary Server,远程字典服务&…...
辞九门回忆
2025年月日,13~30℃,挺好的 待办: 《高等数学2》期末试卷 高数重修电子版材料 冶金《物理》期末试卷 《物理[2]》期末试卷 批阅冶金《物理》作业→→统计平时成绩 遇见:遇见一位小姐姐。 感受或反思:不主动推动关系&a…...
全球城市范围30米分辨率土地覆盖数据(1985-2020)
Global urban area 30 meter resolution land cover data (1985-2020) 时间分辨率年空间分辨率10m - 100m共享方式保护期 277 天 5 时 42 分 9 秒数据大小:8.98 GB数据时间范围:1985-2020元数据更新时间2024-01-11 数据集摘要 1985~2020全球城市土地覆…...
java编程式、声明式事务简单介绍
大家吼鸭!今天学习新项目的时候,项目中运用了编程式项目,有点不理解什么叫编程式事务,于是我去查询了一些资料,大概了解了一下。现在做一个简单的介绍。 编程式事务和声明式事务的区别 现在想象一个场景,…...
Golang 遇见 Kubernetes:云原生开发的完美结合
Golang 和 Kubernetes 简介 Golang 概述 Golang,也称为 Go,是由 Google 开发的一种开源编程语言。Go 由 Robert Griesemer、Rob Pike 和 Ken Thompson 设计,于 2009 年首次发布,此后在各个领域都获得了广泛的关注,尤其…...
第三章,GRE和MGRE
VPN---虚拟专用网络 VPN的核心技术----隧道技术---封装 GRE---通用路由封装 配置 GRE的配置: R1: [r1]interface Tunnel 0/0/0 ---创建一个虚拟的隧道接口 [r1-Tunnel0/0/0]ip address 192.168.3.1 24 ---给隧道接口分配一个IP地址 [r1-Tunnel0/0/0]t…...
redis常用集合操作命令
在 Redis 的命令行界面(redis-cli)中, Redis 的集合(Set)是无序的,且集合中的元素是唯一的。Redis 本身没有直接提供获取集合中某个特定属性的命令,因为集合中的元素是简单的值,而不…...
vue3中ref在js中为什么需要.value才能获取/修改值?
文章目录 [TOC](文章目录) 一、ref定义值什么情况下需要.value1. 情况1:在js中需要使用.value2. 情况2:在html模版中不需要使用.value3. 情况31.代码2.效果3. 二、重新了解一下vue2和vue3的响应式1.vue2(Object.defineProperty)2.vue3(proxy&…...
使用vue2 开发一个纯静态的校园二手交易平台-前端项目练习
这篇文章给大家分享一个适合练习学习前端技术的项目:校园二手交易平台系统。 因为最近在学习vue相关的技术,所以就根据学习的前端技术,来写一些纯前端的项目来练习,这篇文章主要是分享一下 我做的这个项目的一些功能,如…...
使用wavesurferJs实现录音音波效果
效果图展示 插件安装 npm i wavesurfer实现过程 <!-- author: weileiming date: 2025-04-26 14:04:08 description: 悬浮音波层 props:isRecord: 录制状态waveOptions: 音波基础配置overlayStyle: 基础蒙层配置 methods:togglePlay: 切换录制状态 --> <template>…...
Golang 类型方法
在 Go 语言中,方法绑定到任意类型的特性可以称为 “类型方法(Type Methods)” 或 “接收者方法(Receiver Methods)”,它体现了以下几种核心编程思想: 1. 官方术语:接收者方法&#x…...
多模态常见面试题
多模态常见面试 一、最近关注的论文,多模态视觉大模型(CLIP,DALLE)?二、blip2的架构,优势和之前多模态模型的区别?三、多模态融合后,怎样知道最终结果受哪种模态影响更大?四、多模态中常见的SOTA模型有哪些…...
LangChain构建大模型应用之RAG
RAG(Retrieval-augmented Generation 检索增强生成)是一种结合信息检索与生成模型的技术,通过动态整合外部知识库提升大模型输出的准确性和时效性。其核心思想是在生成答案前,先检索外部知识库中的相关信息作为上下文依据…...
Git 全面解析:从核心概念到生态应用
Git 一、Git 起源与定位 诞生背景:2005 年由 Linus Torvalds 为管理 Linux 内核开发而设计,因 BitKeeper 许可证争议,急需分布式版本控制系统(DVCS)替代集中式工具(如 SVN)。核心优势&#x…...
国产免费工作流引擎star 5.9k,Warm-Flow版本升级1.7.0(新增大量好用功能)
国产免费工作流引擎star 5.9k,Warm-Flow版本升级1.7.0(新增大量好用功能) 主要更新内容项目介绍功能思维导图设计器流程图演示地址官网Warm-Flow视频 之前大家一直吐槽没有撤销、驳回到上一个任务和拿回等功能,此次版本全都带给大…...
camera知识学习
1、DSP DSP(数字信号处理器),这个是介于sensor和ISP处理的一个处理阶段,会进行一些传感器方面的偏硬件处理,再进行数据格式的转换,将raw数据转换成RGB数据或者YUV数据...
Java高频常用工具包汇总
Java高频常用工具包汇总 Java生态系统中有许多广泛使用的工具包,以下是一些高频常用的工具包分类汇总: 1. 核心工具包 Apache Commons系列 Commons Lang - 提供各种基础工具类Commons IO - 文件/IO操作工具Commons Collections - 集合扩展工具Commons …...
蓝桥杯 16. 密文搜索
密文搜索 原题目链接 题目描述 福尔摩斯从 X 星收到一份资料,全部是小写字母组成。 他的助手提供了另一份资料:许多长度为 8 的密码列表。 福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。 请你编写一个程序,从第…...
Spring Boot 中多线程的基础使用
1. 核心机制 Spring Boot 通过 TaskExecutor 和 Async 注解支持多线程编程,结合线程池管理,有效提升应用性能。核心组件包括: EnableAsync:启用异步任务支持。 Async:标记方法为异步执行。 ThreadPoolTaskExecutor&…...
660SJBH企业信息管理系统
第一章 问题来源 1.1 课题提出背景和意义 由于企业规模进一步扩大,企业信息的管理也变得越来越复杂。为此,切实有效的把企业信息管理系统引入企业管理领域中,对于促进企业管理制度和提高企业质量有着显着意义。 Internet的发展使我们的企业…...
OpenCV实验室工具的使用
OpenCV实验室工具是一个调用OpenCV常见函数,让用户调整参数,快速得到试验结果的工具软件。 软件界面中包含三列,第一列是功能菜单,第二列是实现某一功能时需要输入的参数,第三列是图像处理历史。 OpenCV实验室包含了常…...
月之暗面开源-音频理解、生成和对话生成模型:Kimi-Audio-7B-Instruct
一、Kimi - Audio 简介 Kimi - Audio 是一个开源的音频基础模型,在音频理解、生成和对话等方面表现出色。其设计旨在作为一个通用的音频基础模型,能够在单一统一的框架内处理各种音频处理任务,如语音识别(ASR)、音频问…...
依赖于切片级标签,结合信息瓶颈理论,对弱监督病理切片分类模型进行微调
小罗碎碎念 在医学AI领域,病理全切片图像(WSI)分析意义重大,但面临诸多难题。 高分辨率的WSI使得获取精确注释极为困难,且计算成本高昂。 多实例学习(MIL)虽能利用WSI级弱监督缓解注释压力&…...
UE5 NDisplay 单主机打包运行
前言 最近在做UE的左右眼双屏输出,找了半天只有近年来比较火的NDispaly可以做这件事了,看了一下官方的教程写的很全面,但是相对笼统了一些,发现B站和一些博客了也写了有,但是我建议还是好好过一遍官方文档吧࿰…...
Kubernetes/KubeSphere 安装踩坑记:从 context deadline exceeded 到成功部署的完整排障笔记
目录 Kubernetes/KubeSphere 安装踩坑记:从 context deadline exceeded 到成功部署的完整排障笔记 一、问题现象 二、第一手日志采集 三、定位思路 四、分步解决 4-1 处理 pause:3.8 4-2 处理 kube-apiserver:v1.31.0 五、再次安装并验证 六、经验总结 七…...