LCA_Tarjan

参考博客:https://www.cnblogs.com/JVxie/p/4854719.html

LCA的Tarjan写法需要结合并查集

从叶子节点往上并

int Find (int x) {
return x == pre[x] ? x:pre[x] = Find(pre[x]);
}
void dfs(int x,int w,int fa) {
d[x] = w; //点x的深度
//遍历与点x相连的点(除了已经访问过的和其父节点)
for (int i = ; i < v[x].size(); i++) {
if (!vis[v[x][i]] && v[x][i] != fa) {
dfs(v[x][i],w+,x);
pre[v[x][i]] = x;
vis[v[x][i]] = ;
}
}
//访问所有和x有询问关系的e
//如果e被访问过;
   //x,e的最近公共祖先为find(e);
}

LCA_倍增

  参考博客:https://www.cnblogs.com/zhouzhendong/p/7256007.html

  先写暴力写法:当x,y深度不同时先把深的调到和浅的同一深度再一起往前面跳找其最近公共祖先。

void dfs(int f,int u){
fa[u]=f;
d[u]=d[f]+;
for (int i=;i<v[u].size();i++)
if (v[u][i]!=f) dfs(u,v[u][i]);
}
int LCA(int a,int b){
if (d[a]>d[b])
swap(a,b);
while (d[b]>d[a]) b=fa[b];
while (a!=b) a=fa[a],b=fa[b];
return a;
}

  显然,一个一个的跳太慢了,我们可以考虑通过二进制进行优化,也就是倍增。

void dfs(int f,int u) {
fa[u][] = f;
dep[u] = dep[f] + ;
for (int i = ; i <= ; i++) {
fa[u][i] = fa[fa[u][i-]][i-];
//其他操作
}
for (int i = ; i < v[u].size(); i++) {
if (f == v[u][i]) continue;
dfs(u,v[u][i]);
}
}
void lca(int x,int y) {
memset(ans,,sizeof(ans));
if (dep[x] < dep[y]) swap(x,y);
for (int i = ; i >= ; i--)
if (dep[fa[x][i]] >= dep[y]) {
//其他操作
x = fa[x][i];
}
if (x == y) {
return;
}
for (int i = ; i >= ; i--)
if (fa[x][i] != fa[y][i]) {
//其他操作
x = fa[x][i],y = fa[y][i];
}
}

例题:洛谷P3292 [SCOI2016]幸运数字  | 题解

LCA (Tarjan&倍增)的更多相关文章

  1. [codevs1036]商务旅行<LCA:tarjan&倍增>

    题目链接:http://codevs.cn/problem/1036/ 今天翻箱倒柜的把这题翻出来做了,以前做的时候没怎么理解,所以今天来重做一下 这题是一个LCA裸题,基本上就把另一道裸题小机房的树 ...

  2. HDU 2874 Connections between cities(LCA Tarjan)

    Connections between cities [题目链接]Connections between cities [题目类型]LCA Tarjan &题意: 输入一个森林,总节点不超过N ...

  3. POJ 1986 Distance Queries(LCA Tarjan法)

    Distance Queries [题目链接]Distance Queries [题目类型]LCA Tarjan法 &题意: 输入n和m,表示n个点m条边,下面m行是边的信息,两端点和权,后面 ...

  4. LCA Tarjan方法

    LCA Tarjan方法 不得不说,高中生好厉害,OI大佬,感觉上个大学好憋屈啊! 说多了都是眼泪 链接拿去:http://www.cnblogs.com/JVxie/p/4854719.html

  5. 关于LCA的倍增解法的笔记

    emmmmm近日刚刚学习了LCA的倍增做法,写一篇BLOG来加强一下印象w 首先 何为LCA? LCA“光辉”是印度斯坦航空公司(HAL)为满足印度空军需要研制的单座单发轻型全天候超音速战斗攻击机,主 ...

  6. LCA tarjan+并查集POJ1470

    LCA tarjan+并查集POJ1470 https://www.cnblogs.com/JVxie/p/4854719.html 不错的一篇博客啊,让我觉得LCA这么高大上的算法不是很难啊,嘻嘻嘻 ...

  7. LCA的倍增算法

    LCA,即树上两点之间的公共祖先,求这样一个公共祖先有很多种方法: 暴力向上:O(n) 每次将深度大的点往上移动,直至二者相遇 树剖:O(logn) 在O(2n)预处理重链之后,每次就将深度大的沿重链 ...

  8. [模板]LCA的倍增求法解析

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

  9. hihoCoder #1067 : 最近公共祖先·二 [ 离线LCA tarjan ]

    传送门: #1067 : 最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站 ...

  10. LCA算法解析-Tarjan&倍增&RMQ

    原文链接http://www.cnblogs.com/zhouzhendong/p/7256007.html UPD(2018-5-13) : 细节修改以及使用了Latex代码,公式更加美观.改的过程 ...

随机推荐

  1. oralce 分离表和索引

    总是将你的表和索引建立在不同的表空间内(TABLESPACES). 决不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里. 同时,确保数据表空间和索引表空间置于不同的硬盘上.   “同时 ...

  2. HDU 3397"Sequence operation"(线段树区间和并)

    传送门 •题意 给你一个仅包含 0 和 1 的序列: 在这个序列上有如下操作: (1)0 a b : 将 [a,b] 区间的数置 0: (2)1 a b : 将 [a,b] 区间的数置 1: (3)2 ...

  3. navicat for mysql (10038)如何解决

    1.授权(youpassword修改为你的密码) #本机登陆mysql: $:mysql -u root -p #改变数据库: mysql>use mysql; #从所有主机: mysql> ...

  4. python写的有声小说爬虫

    querybook.py from bs4 import BeautifulSoup from lxml import html import xml import requests import s ...

  5. jQuery 工具类函数-检测对象是否为空

    在jQuery中,可以调用名为$.isEmptyObject的工具函数,检测一个对象的内容是否为空,如果为空,则该函数返回true,否则,返回false值,调用格式如下: $.isEmptyObjec ...

  6. 研发环境容器化实施过程(docker + docker-compose + jenkins)

    目录 背景介绍 改造思路 容器构建 基础准备 中间件容器 外部依赖容器 业务应用容器 容器整合 自动构建容器 Maven相关 非Maven项目 总结 背景介绍 目前公司内部系统(代号GMS)研发团队, ...

  7. SpringBoot2启动流程分析

    首先上一张图,图片来自 SpringBoot启动流程解析 本文基于spring-boot-2.0.4.RELEASE.jar包分析. 程序启动入口 public static void main(St ...

  8. 让Word Add-in For MediaWiki支持Word 2013

    1.下载并安装Word Add-in For MediaWiki https://www.microsoft.com/en-us/download/details.aspx?id=12298 2.在“ ...

  9. LabWindows/CVI基础

    1.LabWindows/CVI了解 提到NI公司,大家可能最先联想到的是NI公司推出的LabVIEW软件.LabWindows/CVI与LabVIEW相比,主要应用在各种测试.控制.故障分析及信息处 ...

  10. kubernetes实战(三十):CentOS 8 二进制 高可用 安装 k8s 1.17.x

    1. 基本说明 本文章将演示CentOS 8二进制方式安装高可用k8s 1.17.x,相对于其他版本,二进制安装方式并无太大区别. 2. 基本环境配置 主机信息 192.168.1.19 k8s-ma ...