题目描述

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

输入输出格式

输入格式:

第一行包含三个正整数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。

题解

Tarjan求LCA

就是正常的dfs标记一下是否遍历过再加上并查集把子节点往上合并

然后对于每个询问的x判断y是否遍历过

如果是,则标记LCA(x,y)=find(y);

不是的话继续遍历【显然最后肯定都能求出】

代码

//by 减维
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std; struct edge{
int to,ne;
}e[]; struct edgge{
int to,ne,lca;
}ed[]; int n,m,s,ecnt,cnt,head[],hea[],f[];
bool vis[]; int find(int x)
{
if(x==f[x])return x;
f[x]=find(f[x]);
return f[x];
} void add(int x,int y)
{
e[++ecnt].to=y;
e[ecnt].ne=head[x];
head[x]=ecnt;
} void ad(int x,int y)
{
ed[++cnt].to=y;
ed[cnt].ne=hea[x];
hea[x]=cnt;
} void dfs(int x)
{
vis[x]=;
for(int i=head[x];i;i=e[i].ne)
{
int dd=e[i].to;
if(vis[dd])continue;
dfs(dd);
f[find(dd)]=find(x);
}
for(int i=hea[x];i;i=ed[i].ne)
{
int dd=ed[i].to;
if(vis[dd]){
ed[i].lca=find(dd);
}
}
} int main()
{
scanf("%d%d%d",&n,&m,&s);
int x,y;
for(int i=;i<n;++i)
{
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for(int i=;i<=m;++i)
{
scanf("%d%d",&x,&y);
ad(x,y);
ad(y,x);
}
for(int i=;i<=n;++i)f[i]=i;
dfs(s);
for(int i=;i<=cnt;i+=)
printf("%d\n",ed[i].lca==?ed[i+].lca:ed[i].lca);
}

【Tarjan】洛谷P3379 Tarjan求LCA的更多相关文章

  1. 【倍增】洛谷P3379 倍增求LCA

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  2. 【RMQ】洛谷P3379 RMQ求LCA

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  3. 【树链剖分】洛谷P3379 树链剖分求LCA

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  4. 倍增求LCA学习笔记(洛谷 P3379 【模板】最近公共祖先(LCA))

    倍增求\(LCA\) 倍增基础 从字面意思理解,倍增就是"成倍增长". 一般地,此处的增长并非线性地翻倍,而是在预处理时处理长度为\(2^n(n\in \mathbb{N}^+)\ ...

  5. 洛谷3388 tarjan割点

    题目链接:https://www.luogu.com.cn/problem/P3388 tarjan算法果然牛逼,时间复杂度是O(|V|+|E|),所以1e4个结点2e5条边的图完全不在话下orz o ...

  6. NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序

    原文链接https://www.cnblogs.com/zhouzhendong/p/9258043.html 题目传送门 - 洛谷P3953 题目传送门 - Vijos P2030 题意 给定一个有 ...

  7. 洛谷 P3379 【模板】最近公共祖先(LCA)

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  8. 洛谷P3379 【模板】最近公共祖先(LCA)(树链剖分)

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  9. 洛谷P2680 运输计划 [LCA,树上差分,二分答案]

    题目传送门 运输计划 Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n?1 条双向航道,每条航道建立在两个星球之间, 这 n?1 条航道连通了 L 国的所 ...

随机推荐

  1. Vue深度学习(4)-方法与事件处理器

    方法处理器 可以用 v-on 指令监听 DOM 事件: <div id="app"> <button v-on:click = "greet" ...

  2. 基于Gulp + Browserify构建es6环境下的自动化前端项目

    随着React.Angular2.Redux等前沿的前端框架越来越流行,使用webpack.gulp等工具构建前端自动化项目也随之变得越来越重要.鉴于目前业界普遍更流行使用webpack来构建es6( ...

  3. 利用反射操作bean的属性和方法

    今天在开发中碰到这样一个场景:当请求添加项目下的目录时,传过来的是一个IndexModel,这个Model里有关于这个目录字段的详细信息,包括基础报表,实时,漏斗等信息(这些字段类型都是boolean ...

  4. Python的几个常用模块

    一.sys 用于提供对Python解释器相关的操作: sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version ...

  5. Idea中右边的maven projects窗口找不到了如何调出来

    关于Idea中右边的maven  projects窗口找不到了如何调出来? 具体的idea版本我不太清楚,我用的是2016版,其他版本应该也是一样的. 首先idea自带了maven控件,不像Eclip ...

  6. myeclipse 2014 Customize Perspective 失效

    1.将9个jar复制到myeclipse安装目录\plugins中 2.删除和这9个jar同包名但是版本号较低的9个文件 3.重启myeclipse 2014 注:这9个 jar 包 自己到网上搜索, ...

  7. Html转JSP样式变型问题解决

    一.问题描述 在我没将写好的 html 页面转变为 java web 中的 JSP 页面时.有时会发现,我们将 css .js 都引入到了页面中.当样式和我们想象的不一样,那么我们就要去解决这个问题. ...

  8. restfull软件架构风格

    概念:restfull是一种软件架构风格,实现该风格不需导jar包,但要使用@PathVariable注解:特点:没有参数,没有扩展名优势: 1.安全 2.简洁高效 3.容易被搜索引擎所收录 如何利用 ...

  9. iOS 从其他程序切换到自己App,屏幕闪一下问题

    这个问题也是个奇葩的bug,如果你从出现闪的界面去找问题,那就入坑了.这种问题第一反应应该去搜索一下,是否设置了隐藏全局导航条返回按钮右边的title.有时候我们不想让导航控制器push的时候在下个界 ...

  10. iOS 视频开发学习

    原文:浅谈iOS视频开发 这段时间对视频开发进行了一些了解,在这里和大家分享一下我自己觉得学习步骤和资料,希望对那些对视频感兴趣的朋友有些帮助. 一.iOS系统自带播放器 要了解iOS视频开发,首先我 ...