首页 > 编程语言 >最近公共祖先 倍增算法

最近公共祖先 倍增算法

时间:2023-09-24 19:00:30浏览次数:39  
标签:dep fa 祖先 father cin int 算法 -- 倍增

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

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
vector<int> g[N];
int dep[N], fa[N][22];
void dfs(int u, int father) {
	dep[u] = dep[father] + 1;
	fa[u][0] = father;//2的i次方的点
	for (int i = 1; i <= 19; i++) {//跳跃
		fa[u][i] = fa[fa[u][i - 1]][i - 1];
	}
	for (auto v : g[u]) {
		if (v == father) continue;
		dfs(v, u);
	}
}
int lca(int u, int v) {
	if (dep[u] < dep[v]) swap(v, u);//让u为深度最大的点
	for (int i = 19; i >= 0; i--) {
		if (dep[fa[u][i]] >= dep[v])//达到与v等深
			u = fa[u][i];
	}
	if (v == u) 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];//返回他们的父亲【公共祖先】
}
int main() {
	ios::sync_with_stdio(0), cin.tie(0),cout.tie(0);
	int n, m, S;
	cin >> n >> m >> S;
	for (int i = 1; i < n; i++) {
		int x, y;
		cin >> x >> y;
		g[x].push_back(y);
		g[y].push_back(x);
	}
	dfs(S, 0);
	while (m--) {
		int x, y;
		cin >> x >> y;
		cout << lca(x, y) << '\n';
	}
	return 0;
}

标签:dep,fa,祖先,father,cin,int,算法,--,倍增
From: https://www.cnblogs.com/bu-fan/p/17726427.html

相关文章

  • 文心一言 VS 讯飞星火 VS chatgpt (99)-- 算法导论9.3 5题
    五、用go语言,假设你已经有了一个最坏情况下是线性时间的用于求解中位数的“黑箱”子程序。设计一个能在线性时间内解决任意顺序统计量的选择问题算法。文心一言:为了在线性时间内解决任意顺序统计量的选择问题,我们可以使用一个基于快速选择算法的方法。快速选择算法是基于快速排序的......
  • 算法打卡|Day4 链表part02
    Day4链表part02今日任务●24.两两交换链表中的节点●19.删除链表的倒数第N个节点●面试题02.07.链表相交●142.环形链表II[TOC]Problem:24.两两交换链表中的节点思路1.迭代法就要注意画图!画图!还是画图!另外迭代的次序不要忘记,链表迭代统一从左往右迭代。用三......
  • 深度学习算法中的遗传编程(Genetic Programming)
    深度学习算法中的遗传编程(GeneticProgramming)引言深度学习算法在近年来取得了巨大的成功,广泛应用于计算机视觉、自然语言处理等领域。然而,深度学习算法仍然面临着一些挑战,例如需要大量的标注数据、模型结构的选择等。为了解决这些问题,研究者们开始探索结合遗传编程(GeneticProgram......
  • 算法刷题:图论(9.23,持续更)
    目录基础知识有向图顶点类邻接表邻接矩阵入度、出度有向加权图无向图(双向图)图的遍历题目DAG所有可能的路径判断二分图dfs解法bfs解法基础知识点:顶点、邻接节点边:有向边、无向边、加权边度:入度、出度、无向边的度环:环、自环(glist[i]中有i)连通性:连通图、不连通有向图顶点......
  • 【POJ 3253】Fence Repair 题解(贪心算法+优先队列+哈夫曼树)
    农夫约翰想修理牧场周围的一小段围栏。他测量了围栏,发现他需要N(1≤N≤20000)块木板,每块木板都有一定的整数长度Li(1≤Li≤50000)单位。然后,他购买了一块长度刚好足以锯入N块木板的长木板(即,其长度为Li长度的总和)。FJ忽略了“切口”,即锯切时锯屑损失的额外长度;你也应该忽略它。FJ伤心地......
  • 9.24算法
    反转链表给你单链表的头节点head,请你反转链表,并返回反转后的链表。 示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=[]输出:[] 提示:链表中节点的数目范围是[0,5000]-5000<=Node.val<=5000 #include<bits/stdc+......
  • 代码随想录算法训练营-动态规划-2|62. 不同路径
    62. 不同路径 1classSolution:2defuniquePaths(self,m:int,n:int)->int:3#创建一个二维列表用于存储唯一路径数4dp=[[0]*nfor_inrange(m)]56#设置第一行和第一列的基本情况7foriinran......
  • 基于Yolov2深度学习网络的车辆检测算法matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本MATLAB2022A 3.算法理论概述        车辆检测是计算机视觉领域中的一个重要问题。它在自动驾驶、智能交通系统、交通监控以及车辆计数等应用场景中起着至关重要的作用。近年来,深度学习在图像识别领域取得了显著的......
  • 算法打卡|Day3 链表part01
    Day3链表part01今日任务●链表理论基础●203.移除链表元素●707.设计链表●206.反转链表[TOC]链表理论基础文章链接:https://programmercarl.com/%E9%93%BE%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html重点:单链表是一种通过指针串联在一起的线性结构,每一......
  • FreeRTOS 中的调度算法
    FreeRTOS中的调度算法01 调度算法概述调度算法的作用:实时系统的调度需求相应时间要求任务优先级资源利用率FreeRTOS调度算法的目标提供可预测的任务调度实现任务的优先级管理最大化系统资源利用率FreeRTOS调度算法的分类:抢占式调度算法 优先级抢占式调度......