LCA最近公共祖先问题(Tarjan离线算法)

三种LCA算法(二):Tarjan算法 Tarjan算法也是一种常用的解决LCA问题的算法,算法复杂度低,O(n + Q),Q为查询次数,基于DFS+并查集,离线算法(首先读入所有的询问(求一次LCA叫做一次询问),然后在算法执行过程中完成所有查询,把查询结果存储起来,再去根据每次查询直接输出结果),离线算法局限性较大。 算法思路: Tarjan算法也是基于DFS的,对于新搜索到的一个节点,首先创建由这个节点构成的集合,再对当前节点 阅读详情

参考:点击打开链接

觉得链接处的代码有的地方好像有问题,然后自己改了改拿了过来。。

问题描述:给定一个有根树,n个节点和n-1条边 以及q个查询 查询两个点的LCA  要求按输入顺序输出q个查询的答案。


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <vector>
using namespace std;

const int maxn = 10000 + 7;
struct node {
    int v, id;
};

int n, q, root;
int in[maxn];   /// 入度
int p[maxn], ran[maxn];  ///并查集
int ans[maxn], vis[maxn], res[maxn];
vector<int> G[maxn];    /// 树
vector<node> que[maxn];  /// 查询

int Find(int x) {
    return p[x] == x ? x : p[x] = Find(p[x]);
}

void Union(int b, int a) {
    int x = Find(a), y = Find(b);
    if(x != y) {
        if(ran[x] > ran[y]) p[y] = x;
        else p[x] = y, ran[y] += ran[x] == ran[y];
    }
}

void tarjan(int u) {
    vis[u] = 1;
    for(int i = 0; i < G[u].size(); ++i) {
        tarjan(G[u][i]);
        Union(u, G[u][i]);
        ans[Find(u)] = u;
    }
    for(int i = 0; i < que[u].size(); ++i) {
        if(vis[que[u][i].v]) {
            res[que[u][i].id] = ans[Find(que[u][i].v)];
            //printf("%d %d %d\n", u, que[u][i].v, ans[Find(que[u][i].v)]);
        }
    }
}

void init() {
    memset(in, 0, sizeof(in));
    memset(ran, 0, sizeof(ran));
    for(int i = 0; i <= n; ++i) G[i].clear(), que[i].clear(), p[i] = i;
    root = 0;
}

void input() {
    scanf("%d%d", &n, &q);
    int u, v;
    init();
    for(int i = 1; i < n; ++i) {
        scanf("%d%d", &u, &v);
        ++in[v];
        G[u].push_back(v);
    }
    for(int i = 0; i < q; ++i) {
        scanf("%d%d", &u, &v);
        que[u].push_back((node){v, i});
        que[v].push_back((node){u, i});
    }
    for(int i = 1; i <= n; ++i) if(!in[i]) {
        root = i;
        break;
    }
}

int main() {
    input();
    tarjan(root);
    for(int i = 0; i < q; ++i)
        printf("%d\n", res[i]);
    return 0;
}


/**

7 5
1 3
3 5
5 7
3 4
1 2
2 6
4 7
4 5
6 7
3 2
4 6

**/


【CANdelaStudio编辑CDD】-21.2-创建OBD诊断$03,$07,$0A和$04服务以及OBD DTC 案例背景(共11页精讲):创建OBD诊断$03,$07,$0A和$04服务;以及OBD DTC。 在《【ISO15031_OBD诊断】-3.1-$03服务Request emission-related diagnostic trouble codes理论部分https://blog.youkuaiyun.com/qfmzhu/article/details/122157513》, 《【ISO15031_OBD诊断】-7.1-$07服务Request emission-related diagnostic trou 阅读详情

相关推荐

Python与numpy版本兼容性排查指南

本文详细解析了Python与numpy版本兼容性问题,提供了快速诊断和解决版本冲突的实用方法。通过查看版本信息、使用官方兼容性对照表以及降级或升级环境等方案,帮助开发者有效避免常见的报错问题,如'ImportError'和'AttributeError'。文章还介绍了使用虚拟环境和requirements.txt等工程实践,确保项目依赖的稳定性。

weixin_29089057的博客 318

LCA(最近公共祖先)问题

http://poetrinity.diandian.com/post/2012-02-04/19684915 LCA(最近公共祖先)问题 LCA问题便是指,给定一棵树T和两个节点u和v,找出u和v的离根节点最远的公共祖先。  方法一:Tarjan离线算法  在学习离线算法的时候先需要先巩固一下深度搜索,并查集  Tarjan离线算法是基于深度优先搜索的,我们从根开始向下搜索

万里晴空 507

XGBoost与Embedding混合建模实战解析

在机器学习领域,特征工程与模型融合是提升预测性能的关键技术。Embedding技术通过将高维稀疏特征(如文本、ID类数据)转化为低维稠密向量,有效捕获语义关联;而XGBoost作为强大的集成学习算法,擅长处理结构化特征并进行自动特征组合。两者结合的混合架构(如Semantic Boosted Trees)在金融风控和推荐系统等场景中展现出显著优势,尤其在处理用户行为序列、商品ID等复杂特征时,相比传统方法能获得更好的模型效果。本文通过电商推荐和金融反欺诈等案例,详解如何实现Embedding+XGBoost

weixin_28718641的博客 324

最近公共祖先(LCA)——离线Tarjan算法+并查集优化

LCA问题(lowest common ancestors):在一个有根树T中,两个节点和的

ww32cc的博客 3021

Web3前沿技术的智能合约安全审计

随着Web3技术的快速发展,智能合约作为区块链应用的核心组件,其安全性问题日益突出。本文旨在系统性地介绍智能合约安全审计的技术体系,帮助开发者理解智能合约安全风险,掌握安全审计的方法论和工具链。智能合约安全的基本概念常见漏洞类型及其原理安全审计的技术方法实际审计案例分析安全审计工具和资源首先介绍基本概念和背景然后分析常见漏洞和安全风险接着详细讲解安全审计技术提供实际案例和代码示例最后讨论工具资源和未来趋势智能合约:运行在区块链上的自执行程序,代码即法律安全审计。

AI天才研究院 1545

openEuler 22.03 LTS SP4离线安装UKUI桌面全攻略(附依赖包下载)

本文提供openEuler 22.03 LTS SP4系统离线安装UKUI桌面环境的完整实战指南。针对无网络环境,详细解析了利用dnf工具下载依赖包、配置离线软件源、处理依赖冲突及安装后优化的全流程,并附带了关键依赖包资源,帮助运维人员高效完成图形化部署。

c7d8e9的博客 477

LCA tarjan 离线算法学习

最近公共祖先(Least Common Ancestors)LCA 定义:对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u、v的祖先且x的深度尽可能大。另一种理解方式是把T理解为一个无向无环图,而LCA(T,u,v)即u到v的最短路上深度最小的点。 离线算法Tarjan:   利用并查集优越的时空复杂度,我们可以实现LCA问题的O(n+Q)...

dcc1117的博客 245

公文流转系统

公文录入区 | QLineEdit(文号/标题)、QComboBox(公文类型/紧急程度)、QTextEdit(正文)、QListWidget(附件列表)、QPushButton(上传附件/保存草稿/提交审批) |// 按时间范围获取。QStringList userNames = {"张三", "李四", "王五", "赵六", "钱七", "孙八", "周九", "吴十", "郑十一", "王十二"};

寒寒豆豆软件公司的博客 549

Tarjan 算法解决 LCA 问题

算法

实践求真知 978

基于改进Unet的多场景水果图像分割与分类研究

本文针对复杂场景下的水果图像分割问题,提出了一种改进Unet模型。通过构建包含8类水果、3种成熟度及多种干扰场景的数据集,采用ResNet50与MobileNetV3作为骨干网络,并在跳跃连接层集成CBAM注意力机制。实验表明,改进模型在测试集上达到91.6%的mIoU,推理速度提升23%,特别在重叠水果和低光照场景表现突出。研究为农业视觉检测提供了有效解决方案。

AI的内部世界的博客 302

基于STM32L4XX 、HAL库的ATD5984步进电机驱动器驱动程序应用设计

一、简介: ATD5984是一款内部集成了译码器的微特步进电机 驱动器,能使双极步进电机以全、半、1/4、/1/8、1/16 和1/32步进模式工作。步进模式由逻辑输入管脚MSx选 择。其输出驱动能力达到28V±1.6A。 译码器是ATD5984易于使用的关键,通过STEP管脚 输入一个脉冲就可以使电机完成一次步进,省去了相序 表,高频控制线及复杂的编程接口,使其更适于没有复 杂的微处理器或微处理器负担过重的场合。 在步进操作期间,ATD5984的内部电路可以自动

PP_Cottage的博客 404

LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现

首先是最近公共祖先的概念(什么是最近公共祖先?):     在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节点。     换句话说,就是两个点在这棵树上距离最近的公共祖先节点。     所以LCA主要是用来处理当两个点仅有唯一一条确定的最短路径时的路径。     有人可能会问:那他本身或者其父亲节点是否可以作为祖先节点呢?...

dxx707099957的博客 159

相机Camera日志分析之二十六:高通相机Camx 基于预览1帧的process_capture_request重要完整日志【见注释】

文章摘要:该日志记录了一个相机预览请求的处理流程。系统从HAL层开始处理capture_request,填充预览/拍照的buffer数据,并激活相关pipeline。流程涉及多个模块(ChiNodeWrapper、IFE、IPE等)的协同工作,包括获取ImageBuffer、设置请求映射关系、处理特征美颜参数(开关状态0,级别1)等关键步骤。日志详细展示了从请求下发到各节点处理的完整链路,包含多次buffer获取、fence设置及数据传递过程,最终完成预览帧数据的处理和保存(第0帧和第1帧)。该流程体现了移

515

Tarjan算法求解最近公共祖先问题

起因是因为一道树形DP。。要用到求双连通分量和双连通缩点算法的算法。。于是学了一发。。 Tarjan算法可求解最近公共祖先问题(LCA),即给一颗有根树,给出若干个查询(u,v),每次查询给出u和v的最近公共祖先。 这个算法是基于dfs和并查集的。最开始从根开始搜索,对每个子树进行深搜。由于是后序遍历,那么可以发现这样一个性质,对于一个查询(u,v),假设其公共祖先为w,那么当访问到w时,必定

ACMiao的博客 898

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LCA算法

Tarjan算法 不论咱们所面对的二叉树是二叉查找树,或不是二叉查找树,都可以把求任意两个结点的最近公共祖先,当做是查询的问题,如果是只求一次,则是单次查询;如果要求多个任意两个结点的最近公共祖先,则相当于是批量查询。 涉及到批量查询的时候,咱们可以借鉴离线处理的方式,这就引出了解决此LCA问题的Tarjan离线算法。 2.1、什么是Tarjan算法 Tarjan算法 (以发现者Rober...

CX的blogs 2294

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【图论】LCA最近公共祖先

概述篇 LCA (Least Common Ancestors) ,即最近公共祖先,是指这样的一个问题:在一棵有根树中,找出某两个节点 u 和 v 最近的公共祖先。 LCA 可分为在线算法与离线算法 在线算法:指程序可以以序列化的方式一个一个处理输入,也就是说在一开始并不需要知道所有的输入。离线算法:指一开始就需要知道问题的所有输入数据,而在解决一个问题后立即输出结果。 算法篇 对于该问...

Kuguotao的博客 469

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

最形象的讲解,让你一次学会什么叫LCA离线算法tarjan

今天刚学了LCA离线tarjan算法。下面跟大家分享一下我的学习心得。 首先LCA是Lowest Common Ancestors的缩写。中文名为最近公共祖先。然后就是什么叫离线,与离线相对应的是在线算法(用dfs + rmp)的区别在哪里。 离线算法就是把所有的询问存起来,最后一次解决输出结果。结果有可能需要所有的询问(更新)之后才能得到。 在线算法就是每次询问一次,输出询问结果,每次的结果

creatorx的博客 4998

tarjan LCA 算法

LCA是求最近公共祖先问题, tarjan的算法是离线算法,时间复杂度为O(n+Q),n为数据规模,Q为询问个数其中用到并查集。关键是dfs的主循环比较重要。离线算法就是对每个查询,都要求以下,此算法在lrj的黑书中简单提起过,后边还有O(n)-o(1)的算法,正在研究中。。。分类,使每个结点都落到某个类中,到时候只要执行集合查询,就可以知道结点的...

weixin_30919571的博客 240

LCA 离线算法 tarjan 总结 与模板题

LCA问题为最近公共祖先问题,常见的有一种在线的算法和一种离线的算法。这里介绍一下离线的tarjan算法。 离线算法需要首先读入所有的查询,然后重新组织对查询处理的顺序来达到更高效的处理。 tarjan算法使用的是dfs + 并查集的思想。 算法描述: 对于每一个dfs到的节点,就需要在并查集中创建一个以这个节点为独立的集合,然后继续dfs子树,当搜索完子树的时候,也就将与这个子树内的LCA

liujc_的专栏 2028

最近公共祖先(Least Common Ancestors,LCA)问题详解

问题描述与分析求有根树的任意两个节点的最近公共祖先。 解答这个问题之前,咱们得先搞清楚到底什么是最近公共祖先。最近公共祖先简称LCA(Lowest Common Ancestor),所谓LCA,是当给定一个有根树T时,对于任意两个结点u、v,找到一个离根最远的结点x,使得x同时是u和v的祖先,x 便是u、v的最近公共祖先。(参见:http://en.wikipedia.org/wiki/Lowes...

weixin_34247032的博客 364

【模板】LCA Tarjan算法

首先要说明,Tarjan算法是离线算法,需要在算法流程中读入全部询问,一次dfs出结果,然后再一次性输出来,复杂度为 O(α(n)+Q)O(α(n)+Q)O(\alpha (n) + Q) 。 Tarjan算法的核心思想是先进行一遍深度优先搜索,在讨论 LCA与RMQ的关系 的时候,我们已经论述过 uuu 向 vvv 遍历过程中深度最小的点就是 LCA(T,u,v)LCA(T,u,v)LCA...

夕弦 483

最小公共祖先 模板+洛谷p1967

一、(LCA) 倍增思想,优化了暴力找公共祖先 #include <stdio.h> #include <queue> #include <math.h> #include <algorithm> using namespace std; int head[500005],nex[500005*2],ver[500005*2]; int tot,t,...

weixin_44879687的博客 331

『图论』LCA 最近公共祖先----Tarjan 算法

概述篇 LCA (Least Common Ancestors) ,即最近公共祖先,是指这样的一个问题:在一棵有根树中,找出某两个节点 u 和 v 最近的公共祖先。   LCA 可分为在线算法与离线算法 在线算法:指程序可以以序列化的方式一个一个处理输入,也就是说在一开始并不需要知道所有的输入。离线算法:指一开始就需要知道问题的所有输入数据,而在解决一个问题后立即输出结

riba2534的博客 1857

LCA的tarjan算法--总结

LCA问题,即最近公共祖先问题,有很多种解法,其中比较高效的有在线的转化为ST表的算法、树上倍增算法,和离线的tarjan算法。在线的算法都很简单,这里要讲的是离线的tarjan算法。思想tarjan算法其实也并不难理解,它的主要思想就是利用了DFS的深度优先的顺序,算法的主框架就是一个DFS遍历,同时利用了并查集的快速合并。理解的时候可以对DFS的过程进行拆分,把访问一个节点过程拆分为访问它和退出

Sdywolf的博客 755

POJ 1470 Closest Common Ancestors (LCA 离线算法)

Closest Common Ancestors Write a program that takes as input a rooted tree and a list of pairs of vertices. For each pair (u,v) the program determines the closest common ancest...

zhe 264

Lca 最近公共祖先

最近公共祖先 目录 简介 实例算法   最近公共祖先(Least Common Ancestors)   LCA 编辑本段简介   对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u、v的祖先且x的深

robertin的专栏 1149
上一篇: HDU 4192(中缀表达式转后缀表达式)
下一篇: ZOJ 3195(LCA模板)
THE___BEST
博客等级 码龄12年 10粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值