首先,我们先来了解LCA。

LCA 是树上两个点最近的公共祖先。

比如说,在如图的树中,3与4的公共祖先有“2”,“1”,但最近的祖先是“2”。

显然,暴力可以做O(n),但是我们希望更快。

现在,有两种方法:

  1)在线操作,但这需要“倍增”,再此不讨论。

  2)离线操作,使用Tarjan与并查集。

先给出操作方法:

DFS (u)
   for i in u.son
      DFS(i)
      UNION(u,i)
   for i in u.e # e 表示 e 与访问所有和u有询问关系的i
      if i.vis
         (u,i).LCA = find(i)

可以发现,操作是在深搜中进行的。下面开始模拟。

初始值:

;
;
;
;
;
;

第一次操作后:

;
;
;
;
;
;

第二次操作后:

;
;
;

;
;

第三次操作后:

;
;
;
;
;
;

另附代码:

#include <iostream>  
#include <stdio.h>  
#include <algorithm>  
#include <string.h>  
using namespace std;  
  
;
;   
int f[maxn];
int find(int x)  
{  
)  
        return x;  
    return f[x]=find(f[x]);  
}  
void unite(int u,int v)  
{  
    int x=find(u);  
    int y=find(v);  
    if(x!=y)  
        f[x]=y;  
}  
  
bool vis[maxn];
int ancestor[maxn];
struct Edge  
{  
    int to,next;  
];  
int head[maxn],tot;  
void addedge(int u,int v)
{  
    edge[tot].to=v;  
    edge[tot].next=head[u];  
    head[u]=tot++;  
}  
  
struct Query  
{  
    int q,next;  
    int index; 
];  
];
int h[maxn],tt;  
int Q;
  
void addquery(int u,int v,int index)
{  
    query[tt].q=v;  
    query[tt].next=h[u];  
    query[tt].index=index;  
    h[u]=tt++;  
    query[tt].q=u;
    query[tt].next=h[v];  
    query[tt].index=index;  
    h[v]=tt++;  
}  
  
void init()  
{  
;  
,sizeof(head));  
;  
,sizeof(h));  
,sizeof(vis));  
,sizeof(f));  
,sizeof(ancestor));  
}  
  
void LCA(int u)  
{  
    ancestor[u]=u;  
    vis[u]=true;  
;i=edge[i].next) 
    {  
        int v=edge[i].to;  
        if(vis[v])  
            continue;  
        LCA(v);  
        unite(u,v);  
        ancestor[find(u)]=u;
    }  
;i=query[i].next)
    {  
        int v=query[i].q;  
        if(vis[v])  
            ans[query[i].index]=ancestor[find(v)];  
    }  
}  
bool flag[maxn];
  
int t;  
int n,u,v;  
  
int main()  
{  
    cin >> n;  
    init();  
,sizeof(flag));  
;i<n;i++)  
    {  
        cin >> u >> v; 
        flag[v]=true; 
        addedge(u,v);  
        addedge(v,u);  
    }  
    cin >> Q;
;i<Q;i++)  
    {  
        scanf("%d%d",&u,&v);  
        addquery(u,v,i);  
    }  
    int root;  
    cin >> root;
    LCA(root);  
;i<Q;i++)  
        printf("%d\n",ans[i]);  
;  
}  

LCA【Tarjan】的更多相关文章

  1. LCA 【bzoj1787】[Ahoi2008]Meet 紧急集合

    LCA [bzoj1787][Ahoi2008]Meet 紧急集合 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1787 注意到边权为一 ...

  2. Tarjan缩点+LCA【p2783】有机化学之神偶尔会做作弊

    Description 你翻到那一题:给定一个烃,只含有单键(给初中生的一个理解性解释:就是一堆碳用横线连起来,横线都是单条的). 然后炎魔之王拉格纳罗斯用他的火焰净化了一切环(???).所有的环状碳 ...

  3. 【tarjan】BZOJ2140-稳定婚姻

    又名NTR的故事 [题目大意] n对夫妻Bi和Gi.若某男Bi与某女Gj曾经交往过,他们有私奔的可能性.不妨设Bi和Gj旧情复燃,进而Bj会联系上了他的初恋情人Gk,以此递推.若在Bi和Gi离婚的前提 ...

  4. 【Tarjan】洛谷P3379 Tarjan求LCA

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

  5. poj 3694 Network 【Tarjan】+【LCA】

    <题目链接> 题目大意: 给一个无向图,该图只有一个连通分量.然后查询q次,q < 1000, 求每次查询就增加一条边,求剩余桥的个数. 解题分析: 普通的做法就是在每加一条边后,都 ...

  6. 【Tarjan】【LCA】【动态规划】【推导】hdu6065 RXD, tree and sequence

    划分出来的每个区间的答案,其实就是连续两个的lca的最小值. 即5 2 3 4 这个区间的答案是min(dep(lca(5,2)),dep(lca(2,3),dep(lca(3,4)))). 于是dp ...

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

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

  8. ⌈洛谷5058⌋⌈ZJOI2004⌋嗅探器【Tarjan】

    题目连接 [洛谷传送门] [LOJ传送门] 题目描述 某军搞信息对抗实战演习,红军成功地侵入了蓝军的内部网络,蓝军共有两个信息中心,红军计划在某台中间服务器上安装一个嗅探器,从而能够侦听到两个信息中心 ...

  9. BFS+最小生成树+倍增+LCA【bzoj】4242 水壶

    [bzoj4242 水壶] Description JOI君所居住的IOI市以一年四季都十分炎热著称. IOI市是一个被分成纵H*横W块区域的长方形,每个区域都是建筑物.原野.墙壁之一.建筑物的区域有 ...

随机推荐

  1. 测试需要了解的技术之基础篇四__UI自动化测试体系

    UI自动化测试体系 1.Andriod 自动化测试:Appium 环境安装与架构介绍.Appium Desktop用例录制.Appium测试用例流程.元素定位方法 IA/AID/XPATH/UISel ...

  2. Java——HashMap源码解析

    以下针对JDK 1.8版本中的HashMap进行分析. 概述     哈希表基于Map接口的实现.此实现提供了所有可选的映射操作,并且允许键为null,值也为null.HashMap 除了不支持同步操 ...

  3. Grafana设置匿名登录

    将配置文件中的auth.anonymous的enabled设置为true就可以匿名登录,不用输入用户名和密码 #################################### Anonymou ...

  4. linux文件属性软硬连接

    硬链接:ln 源文件 目标文件 软链接:ln -s 源文件 目标文件 硬链接总结: 1.具有相同inode节点号的多个文件互为硬链接文件 2.删除硬链接文件或者删除源文件任意之一,文件实体并未被删除. ...

  5. 【Linux 环境搭建】Ubuntu下安装tftp

    1.安装软件    sudo apt-get install tftp-hpa tftpd-hap xinetd 2.修改配置文件    sudo vim /etc/default/tftpd-hpa ...

  6. mybatis oracle 批量新增

    假定场景:批量导入用户信息 一般批量新增使用 SELECT … INSERT INTO 和 INSERT INTO … SELECT 我们这次使用第二种 一.先建一张用户信息表模拟批量导入用户信息 c ...

  7. LeetCode 235. 二叉搜索树的最近公共祖先

    235. 二叉搜索树的最近公共祖先 题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先 ...

  8. C#修改电脑桌面图

    win32helper public class Win32Helper { [DllImport("user32.dll", EntryPoint = "SystemP ...

  9. 深度学习之(经典)卷积层计算量以及参数量总结 (考虑有无bias,乘加情况)

    目录: 1.经典的卷积层是如何计算的 2.分析卷积层的计算量 3.分析卷积层的参数量 4.pytorch实现自动计算卷积层的计算量和参数量 1.卷积操作如下: http://cs231n.github ...

  10. ECMAScript 6 学习笔记(一)

    ECMAScript 6简介 ECMAScript 6.0(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了.它的目标,是使得JavaScript语言可以用来编写 ...