最近公共祖先模板(LCA)
include <bits/stdc++.h>
using namespace std;
struct LCA {
int n;
vector<int> dep;
vector<vector<int>> e;
vector<array<int, 21>> fa;
LCA() {}
LCA(int n) {
dep.resize(n + 1);
e.resize(n + 1);
fa.resize(n + 1);
}
void add(int u, int v) {
e[u].push_back(v);
e[v].push_back(u);
}
//计算深度,处理各点祖先
void dfs(int u, int father) {
dep[u] = dep[father] + 1;
fa[u][0] = father;
for (int i = 1; i < 20; i ++)
fa[u][i] = fa[fa[u][i - 1]][i - 1];
for (auto v : e[u])
if (v != father)
dfs(v, u);
}
//最近公共祖先
//两点集并的最近公共祖先为两点几分别的最近公共祖先的最近公共祖先,
//即LCA(A∪B) = LCA(LCA(A), LCA(B));
int lca(int u, int v) {
if (dep[u] < dep[v]) swap(u, v);
for (int i = 19; i >= 0; i --)
if (dep[fa[u][i]] >= dep[v])
u = fa[u][i];
if (u == v) return v;
for (int i = 19; i >= 0; i --)
if (fa[u][i] != fa[v][i])
u = fa[u][i], v = fa[v][i];
return fa[u][0];
}
//d(u,v) = h(u) + h(v) - 2h(LCA(u,v));
//其中d是树上两点间的距离,h代表某点到树根的距离
int get_dis(int u, int v) {
return dep[u] + dep[v] - 2 * dep[lca(u, v)];
}
};
最近公共祖先模板(LCA)的更多相关文章
- 洛谷P3379 【模板】最近公共祖先(LCA)
P3379 [模板]最近公共祖先(LCA) 152通过 532提交 题目提供者HansBug 标签 难度普及+/提高 提交 讨论 题解 最新讨论 为什么还是超时.... 倍增怎么70!!题解好像有 ...
- P3379 【模板】最近公共祖先(LCA)
P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...
- 洛谷P3379 【模板】最近公共祖先(LCA)(dfs序+倍增)
P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...
- 「LuoguP3379」 【模板】最近公共祖先(LCA)
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- 洛谷——P3379 【模板】最近公共祖先(LCA)
P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...
- luogo p3379 【模板】最近公共祖先(LCA)
[模板]最近公共祖先(LCA) 题意 给一个树,然后多次询问(a,b)的LCA 模板(主要参考一些大佬的模板) #include<bits/stdc++.h> //自己的2点:树的邻接链表 ...
- 【原创】洛谷 LUOGU P3379 【模板】最近公共祖先(LCA) -> 倍增
P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...
- P3379 【模板】最近公共祖先(LCA)(欧拉序+rmq)
P3379 [模板]最近公共祖先(LCA) 用欧拉序$+rmq$维护的$lca$可以做到$O(nlogn)$预处理,$O(1)$查询 从这里剻个图 #include<iostream> # ...
- 最近公共祖先(LCA)学习笔记 | P3379 【模板】最近公共祖先(LCA)题解
研究了LCA,写篇笔记记录一下. 讲解使用例题 P3379 [模板]最近公共祖先(LCA). 什么是LCA 最近公共祖先简称 LCA(Lowest Common Ancestor).两个节点的最近公共 ...
- 最近公共祖先(LCA)---tarjan算法
LCA(最近公共祖先).....可惜我只会用tarjan去做 真心感觉tarjan算法要比倍增算法要好理解的多,可能是我脑子笨吧略略略 最近公共祖先概念:在一棵无环的树上寻找两个点在这棵树上深度最大的 ...
随机推荐
- spark使用jdbc批次提交方式写入phoniex的工具类
一.需求:spark写入phoniex 二.实现方式 1.官网方式 dataFrame.write .format("org.apache.phoenix.spark") .mod ...
- Pycharm创建的虚拟环境,使用命令行指定库的版本进行安装
Pycharm创建的项目,使用了虚拟环境,对库的版本进行管理:有些项目的对第三方库的版本 要求不同,可使用虚拟环境进行管理 直接想通过pip命令安装,直接看第3点 操作步骤: 1.找到当前项目的虚拟环 ...
- 复习 - ajax
复习呢有一个很直观的感受,就是以前学的东西,萌懂半懂的,这一来全部都清楚了,你以前以为你学的并不好但是复习一次把以前的案例一做,居然能够自己独立完成,知识点看着掌握的还不错. 1. 两天时间就把整个a ...
- Spring的三种依赖注入的方式
1.什么是依赖注入 依赖注入(Dependency Injection,简称DI),是IOC的一种别称,用来减少对象间的依赖关系. 提起依赖注入,就少不了IOC. IOC(Inversion of C ...
- ABC195E
其实我们发现很多博弈论的动态规划都是从后往前的,比如过河卒和本题. 这是因为从某种角度上来说这些动态规划有后效性而无前效性. 所以设计状态 \(dp_{i,j}\) 表示第 \(i\) 次操作 \(T ...
- yb课堂之订单列表接口开发 《十七》
订单列表接口开发 VideoOrderController.java VideoOrderService.java VideoOrderServiceImpl.java VideoOrderMappe ...
- 洛谷·P1130
#include<iostream> #include<utility> using namespace std; typedef long long ll; #define ...
- Solo 独立开发者社区
Solo 独立开发者社区是一个致力于帮助独立开发者发展的社区平台.平台上聚集了大量的独立开发者,他们在这个平台上分享着自己的开发经验.心得和技巧,同时也可以从其他人的分享中获得启发和帮助. 这个社区提 ...
- 深入理解 JavaScript 闭包:前端开发中的重要概念
闭包是 JavaScript 中一个非常重要的概念,对于理解和编写高效.灵活的代码至关重要.尽管它看似复杂,但一旦掌握了闭包,你将能够更好地理解 JavaScript 的函数作用域和变量生命周期.本文 ...
- 宇宙最强开发工具VScode快速搭建前后端分离环境【VUE+Springboot】
VS Code 的全称是 Visual Studio Code,是一款开源的.免费的.跨平台的.高性能的.轻量级的代码编辑器.它在性能.语言支持.开源社区方面,都做得很不错,是这两年非常热门的一款开发 ...