题目链接:https://www.luogu.org/problem/lists?name=LCA

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

题目描述

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

输入输出格式
输入格式:

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

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

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

输出格式:

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

输入输出样例
输入样例#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

说明

时空限制:1000ms,128M

数据规模:

对于30%的数据:N<=10,M<=10

对于70%的数据:N<=10000,M<=10000

对于100%的数据:N<=500000,M<=500000

样例说明:

该树结构如下:

第一次询问:2、4的最近公共祖先,故为4。

第二次询问:3、2的最近公共祖先,故为4。

第三次询问:3、5的最近公共祖先,故为1。

第四次询问:1、2的最近公共祖先,故为4。

第五次询问:4、5的最近公共祖先,故为4。

故输出依次为4、4、1、4、4。

题解

TarjanLCA是一个离线算法,基于dfs序,时间复杂度O(n+m)O(n+m)O(n+m)。

大概过程就是dfs遍历整棵树,在回溯到某个点的时候记录儿子的父亲,在搜索到某个点时查询该点所有的询问,如果询问的点被遍历过,那么该次询问的答案就是那个点的父亲。

在上面的图中,遍历的顺序是4→2→3→2→54\to 2\to 3 \to 2\to 54→2→3→2→5,假设询问是3、5,遍历到3的时候,此时5未遍历,不存答案。在遍历到5的时候,这时已经记录到的父亲是f[2]=5,其余都未回溯到其父亲,故f数组并未记录父亲,数组中的信息都是自己,所以这时对于这组询问可以得出答案2。

TarjanLCA的妙处就是在遍历完一组询问中的两个点时,记录到的父亲刚好就是这两个点的LCA。

不过这道题询问巨多,Tarjan不加读入优化要被卡T。。。

只能sto LPA dalao的树剖LCA orz

还有我的树剖LCA

代码
#include<bits/stdc++.h>
using namespace std;
struct sd{int n,r;
};
const int M=500005;
vector<int>tree[M];
vector<sd>que[M];
int f[M],ans[M];
bool vis[M],vis2[M];
int read()
{int r=0;char c=getchar();while(!isdigit(c)) c=getchar();while(isdigit(c)) r*=10,r+=c-'0',c=getchar();return r;
}
void out(int x)
{if(x>9) out(x/10);putchar(x%10+'0');
}
int find(int v)
{if(f[v]!=v) f[v]=find(f[v]);return f[v];
}
void tarjian(int v)
{vis2[v]=1;for(int i=tree[v].size()-1;i>=0;--i){if(!vis2[tree[v][i]]){tarjian(tree[v][i]);f[tree[v][i]]=v;vis[tree[v][i]]=1;}}for(int i=que[v].size()-1;i>=0;--i){if(vis[que[v][i].n])ans[que[v][i].r]=find(que[v][i].n);}
}
int main()
{int n,m,s,a,b;n=read();m=read();s=read();for(int i=1;i<=n;++i)f[i]=i;for(int i=1;i<n;++i){a=read();b=read();tree[b].push_back(a);tree[a].push_back(b);}sd p;for(int i=1;i<=m;++i){a=read();b=read();p.r=i;p.n=b;que[a].push_back(p);p.n=a;que[b].push_back(p);}tarjian(s);for(int i=1;i<=m;++i){out(ans[i]);putchar(10);}return 0;
}

[Tarjan四连] TarjanLCA相关推荐

  1. 求LCA的四种方法(暴力,倍增,RMQ+ST,Tarjan)

    目录 P3379 [模板]最近公共祖先(LCA) 暴力 倍增法 RMQ+ST Tarjan 四个方法的优缺点比较 P3379 [模板]最近公共祖先(LCA) 暴力 操作步骤: 求出每个结点的深度: 询 ...

  2. bzoj 2730: [HNOI2012]矿场搭建——tarjan求点双

    Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...

  3. 模板 - LCA最近公共祖先(倍增法、Tarjan、树上差分、LCA优化的次小生成树)

    整理的算法模板合集: ACM模板 注意x和y的LCA可以是x或者y本身 一.LCA的在线倍增算法 /*给定一棵包含 n个节点的有根无向树,有 m个询问,每个询问 给出了一对节点的编号 x和 y,询问 ...

  4. 0x66.图论 - Tarjan算法与无向图连通性

    目录 一.无向图的割点与桥 割点 桥/割边 时间戳 搜索树 追溯值 二.割边判定法则 三.割点判定法则 1.luogu P3388 [模板]割点(割顶) 2.luogu P3469 [POI2008] ...

  5. networkx 有向图强连通_leetcode刷题(四):搜索(深度优先搜索,广度优先搜索)拓扑排序,强连通分量...

    在开始今天的话题之前,我们先了解一个概念,什么是图的遍历? 图的遍历就是从图中某一点出发访遍图中其余剩余定点,且每个顶点仅被访问一次,这个过程叫做图的遍历. 图的遍历主要被分为深度优先遍历和广度优先遍 ...

  6. 【OO学习】OO第四单元作业总结及OO课程总结

    [OO学习]OO第四单元作业总结及OO课程总结 第四单元作业架构设计 第十三次作业 第十四次作业 总结 这两次作业架构思路上是一样的. 通过将需要使用的UmlElement,封装成Element的子类 ...

  7. 面向对象第四单元总结

    一.面向对象第四单元总结 1.1 第一次作业总结 1.1.1设计思路 在本次的作业中,主体是类和接口,只要要处理的是类和接口自身的实现以及他们之间的继承和实现关系,而反应在输入标签上,主要是要理解各种 ...

  8. Tarjan 复习小结

    总算把这几个东西策清楚了. 在\(Tarjan\)算法里面,有两个时间戳非常重要,一个是\(dfn\),意为深度优先数,即代表访问顺序:一个是\(low\),意为通过反向边能到达的最小\(dfn\), ...

  9. Kosaraju算法、Tarjan算法分析及证明--强连通分量的线性算法

    一.背景介绍 强连通分量是有向图中的一个子图,在该子图中,所有的节点都可以沿着某条路径访问其他节点.强连通性是一种非常重要的等价抽象,因为它满足 自反性:顶点V和它本身是强连通的 对称性:如果顶点V和 ...

  10. 【BFS】【并查集】【Tarjan】【LCA】Gym - 101173H - Hangar Hurdles

    给你一张地图,给你q次询问,每次问你从A点到B点,最大能移动多大的箱子. 把每个点所能容纳的最大箱子求出来(BFS,八连通,一开始将所有边界点和障碍点入队).然后从大到小排序.然后用并查集将相邻(四联 ...

最新文章

  1. 【 MATLAB 】信号处理工具箱之波形产生函数 pulstran
  2. ArrayList的几种初始化方法
  3. 最新版本mysql jdbc驱动包获取表定义信息空指针异常处理方法
  4. 干燥剂变身“配重剂”,究竟有多少商家在休闲零食市场浑水摸鱼?
  5. PHP的TRUE|FALSE
  6. Nacos源码ServiceManager
  7. 【C语言位运算的应用】如何按bit位翻转一个无符号整型
  8. 项目管理基础:软件生命周期概念介绍
  9. Cheatsheet: 2010 12.13 ~ 12.23
  10. $('tr',grid) 是什么选择器?
  11. python读取文本中的内容
  12. 实验一 分治与递归—用分治法实现元素选择 java算法
  13. Jsoup爬虫以及防反爬
  14. 气象报告是什么计算机领域,计算机辅助翻译系统在亚运气象服务方面地应用报告.pdf...
  15. 清除Tomcat日志
  16. Laravel快速入门
  17. 微信卡券管理 - 修改卡券基本信息
  18. 不义联盟2显示服务器,打开不义联盟2提示网络异常或者连接不上
  19. [zz]美团点评智能支付核心交易系统的可用性实践
  20. Dart笔记(10):Runes

热门文章

  1. 《Web漏洞防护》读书笔记——第3章,其他注入防护
  2. php匿名函数自调用,使用自调用函数和匿名函数吃饭
  3. 分层图最短路【bzoj2763】: [JLOI2011]飞行路线
  4. 23种经典设计模式UML类图汇总
  5. luvcview-0.2.4移植
  6. Oozie 安装及 examples app 的使用
  7. poj 2560 Freckles
  8. C++中的const完全解析
  9. java中同步关键字_Java中的同步关键字
  10. Spring的9种设计模式(一)