首页 > 其他分享 >「Day-4 提高笔记-LCA最近公共祖先」

「Day-4 提高笔记-LCA最近公共祖先」

时间:2024-10-22 19:20:55浏览次数:1  
标签:int 笔记 fa add MAXN tot LCA Day dp

#include<iostream>
using namespace std;

const int MAXN = 5 * 1e5 + 5;
struct node{
	int to,next;
}e[MAXN * 2];
int f[MAXN][20],dp[MAXN];//f[x][i] 表示 x 的第2^i个节点的编号 
int h[MAXN * 2],tot = 0;
int n,m,s;
void add(int x,int y){
	e[++ tot] = {y,h[x]};
	h[x] = tot;
}
void dfs(int x,int fa){
	dp[x] = dp[fa] + 1;
	f[x][0] = fa;//f[x][0] = x的第1(2^0)个父节点的节点编号 
	for(int i = 1;(1 << i) <= dp[x];i ++){
		f[x][i] = f[f[x][i - 1]][i - 1];
	}
	for(int i = h[x];i;i = e[i].next){
		int to = e[i].to;
		if(to != fa){
			dfs(to,x);
		}
	}
	return;
}
int u,v;
int LCA(int x,int y){
	if(dp[x] < dp[y]) swap(x,y);
	for(int i = 19;i >= 0;i --){
		if(dp[x] - (1 << i) >= dp[y]){
			x = f[x][i];
		}
	}
	if(x == y) return x;
	for(int i = 19;i >= 0;i --){
		if(f[x][i] != f[y][i]){
			x = f[x][i];
			y = f[y][i];
		}
	} 
	return f[x][0];
}

int main(){
	cin >> n >> m >> s;
	for(int i = 1;i <= n - 1;i ++){
		cin >> u >> v;
		add(u,v); add(v,u); 
	}
	dfs(s,0);
	for(int i = 1;i <= m;i ++){
		cin >> u >> v;
		cout << LCA(u,v) << '\n';
	}
	return 0;
}

标签:int,笔记,fa,add,MAXN,tot,LCA,Day,dp
From: https://www.cnblogs.com/To-Carpe-Diem/p/18493572

相关文章

  • java笔记
    注释单行注释 ////单行注释多行注释/*注释注释*/文档注释/**文档注释*/标识符所有的标识符都应以字母,美元符($)或下划线(_)开始标识符是大小写敏感的 数据类型强类型语言要求变量的使用要严格符合规定,所有的变量都必须先定义后使用  两大类......
  • Qt学习笔记(二)Qt 信号与槽
    系列文章目录Qt开发笔记(一)Qt的基础知识及环境编译(泰山派)Qt学习笔记(二)Qt信号与槽文章目录系列文章目录@[TOC](文章目录)前言一、Qt信号与槽机制1.1什么是信号和槽1.1信号和槽的关联及断连二、编辑槽函数1.自动关联2.手动关联前言  在学习Qt的过程中,信......
  • Day22--内存分析
    Day22--内存分析Java内存分析:1.堆:存放new的对象和数组;可以被所有的线程共享:不会存放别的对象引用2.栈存放基本变量类型(会包含这个基本类型的具体数值)引用对象的变量(会存放这个引用在堆里面的具体地址)3.方法区可以被所有的线程共享包含了所有的class和static变量......
  • 2024年软件设计师中级(软考中级)详细笔记【9】数据库技术基础(分值6分)
    目录前言第9章数据库技术基础(6分)9.1基本概念9.1.1数据库与数据库系统9.1.5数据库的三级模式结构9.2数据模型9.2.1数据模型的基本概念9.2.2数据模型的三要素9.2.3E-R模型9.2.4数据模型9.3关系代数9.3.1关系数据库的基本概念9.3.1.1关系模型9.3.25种基本的......
  • Cinemachine系列——CinemachineBrain & CinemachineVirtualCamera
    CinemachineBrainCinemachineBrain是Unity摄像机与场景中的Cinemachine虚拟摄像机之间的链接。它监控优先级堆栈以选择当前的虚拟摄像机,并在必要时进行混合。最后,也是最重要的一点,它将虚拟摄像机的状态应用到附加的Unity摄像机上。CinemachineBrain还定义了虚拟摄像机之......
  • 代码随想录算法训练营Day42 | 完全背包理论基础、518.零钱兑换II、377. 组合总和 Ⅳ、
    目录完全背包理论基础518.零钱兑换II377.组合总和Ⅳ卡玛网57.爬楼梯(进阶版)完全背包理论基础题目52.携带研究材料(第七期模拟笔试)题目描述:小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间......
  • zkw 线段树学习笔记
    一、简介zkw线段树专门用于线段树卡常,同时码量比普通线段树要小。原理是通过将线段树补成完全二叉树,直接找到第\(i\)个叶子节点(编号为\(p+i\)),然后从下往上更新,从而避免递归。这里常数p=1<<(__lg(n)+1),编号为\(p\)和\(p+n+1\)的叶子为虚点,编号为\(p+1\simp+n\)的......
  • 二叉树习题其三-Java【力扣】【算法学习day.10】
    前言书接上篇文章二叉树习题其二,这篇文章我们将基础拓展###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!习题1.从中序与后序遍历序......
  • 备战蓝桥杯JAVA B组Day7
    备战蓝桥杯JAVAB组Day7前言零基础小白备战蓝桥杯第七天,刷题内容为:洛谷题单【入门3】循环结构。P5722【深基4.例11】数列求和AC代码:importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(......
  • [DMY]CSP-S 模拟赛 Day 20
    CSP-S前最后一场代码源了。赛时T1看上去是一个很神秘的题目,在纸上推了半天勉勉强强想到一个奇怪的贪心做法。看到数据范围,发现直接做的话会超时,但是考虑到C++内置的sort函数可以帮助优化时间复杂度,所以写了个很丑的神秘排序。发现做完以后只能判断两种特殊情况,思考怎样......