首页 > 其他分享 >LCA板子

LCA板子

时间:2024-07-20 19:50:54浏览次数:8  
标签:cnt int father deep 板子 fa LCA include

倍增法求LCA

编码比较容易

#define _CRT_SECURE_NO_WARNINGS 
#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<sstream>
#include<string>
#include<string.h>
#include<iomanip>
#include<stdlib.h>
#include<map>
#include<queue>
#include<limits.h>
#include<climits>
#include<fstream>
#include<stack>
#define IOS ios::sync_with_stdio(false), cin.tie(0) ,cout.tie(0)
using namespace std;
#define int long long
//LCA板子
const int N = 5e5 + 5;
struct Edge { int to, next; }edge[2*N];
int head[2 * N], cnt;//链式前向星
void init()
{
	cnt = 0;
	for (int i = 0; i < 2 * N; i++) { edge[i].next = -1, head[i] = -1; }
}
void addedge(int u, int v)
{
	edge[cnt].to = v; edge[cnt].next = head[u]; head[u] = cnt++;
}
int fa[N][20], deep[N];
void dfs(int x, int father)
{
	//求x的深度deep[x]和fa[x][],father是x的父节点
	deep[x] = deep[father] + 1;
	fa[x][0] = father;
	for (int i = 1; (1 << i) <= deep[x]; i++)
		fa[x][i] = fa[fa[x][i - 1]][i - 1];
	for (int i = head[x]; i != -1; i = edge[i].next)
		if (edge[i].to != father)
			dfs(edge[i].to, x);
}
int LCA(int x, int y)
{
	if (deep[x] < deep[y])swap(x, y);
	for (int i = 19; i >= 0; i--)
		if (deep[x] - (1 << i) >= deep[y])
			x = fa[x][i];
	if (x == y)return x;
	for (int i = 19; i >= 0; i--)// 如果祖先相等,说明可能跳过头了
		if (fa[x][i] != fa[y][i])//如果不相等,那两个都往前跳
			x = fa[x][i], y = fa[y][i];
	return fa[x][0];
}
signed main()
{
	IOS;
	init();
	int n, m, root; cin >> n >> m >> root;
	for (int i = 1; i < n; i++)
	{
		int u, v; cin >> u >> v;
		addedge(u, v), addedge(v, u);
	}
	dfs(root, 0);
	while (m--)
	{
		int a, b; cin >> a >> b;
		cout << LCA(a, b) << '\n';
	}

	return 0;
}

标签:cnt,int,father,deep,板子,fa,LCA,include
From: https://www.cnblogs.com/zzzsacmblog/p/18313673

相关文章

  • FullCalendar日历组件集成过程合订版
    背景有一些应用系统或应用功能,如日程管理、任务管理需要使用到日历组件。虽然ElementPlus也提供了日历组件,但功能比较简单,用来做数据展现勉强可用。但如果需要进行复杂的数据展示,以及互动操作如通过点击添加事件,则需要做大量的二次开发。FullCalendar是一款备受欢迎的开......
  • [板子库]笔者板子目录
    一.字符串算法1.哈希(版本1)2.哈希(版本2)3.KMP代填4.字典树5.AC自动机二.数据结构1.并查集(查找)2.并查集(路径压缩)3.并查集(合并)4.并查集(按秩合并)5.并查集(删除)代填三.优化1.快读2.快写四.高精度算法1.高精度加法2.高精度减法3.高精度乘法4.高精度除法五.最小生成树......
  • 使用Java和Hazelcast构建高可用的分布式缓存系统
    使用Java和Hazelcast构建高可用的分布式缓存系统大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在分布式系统中,缓存是提高系统性能和可扩展性的关键组件之一。Hazelcast是一种高性能、易用的分布式内存数据网格,支持多种数据结构和分布式计算。本文将介绍......
  • 树上问题/简单算法 LCA【最近公共祖先】
    概念引入最近公共祖先简称\(LCA\)(LowestCommonAncestor)。两个节点的最近公共祖先,就是这两个点的公共祖先里面,离根最远的那个。在下面的说明中,我们设两个节点分别为\(x\),\(y\),节点\(x\),\(y\)的深度分别表示为\(dep_x\),\(dep_y\),将树称为\(T\)算法详解:朴素算法:......
  • 虚树复习 & O(1) 查询 LCA
    放假是不可能做题的。那就写总结把。虚树问题的情境涉及多次树上询问,每次指定一些点,让你计算。此类问题需要我们在线地找到尽可能少的【关键点】进行计算,最好和给的点级别一样。虚树的思想就是这个过程。二次排序一个关键直觉:【指定点】两两的LCA一定是【关键点】。并且......
  • 最近公共祖先(LCA)
    https://www.luogu.com.cn/problem/P7103第4题   最近公共祖先 查看测评数据信息小Soup正在翻看他们家的族谱,他们家的族谱构成了一棵树。小Soup发现,由于年代久远,他们家族中的一些分支已经绝迹,他对此十分好奇。小Soup给你他们家的族谱树,想要问你在这棵树中所有第......
  • 板子
    #include<bits/stdc++.h>usingnamespacestd;namespaceIOS{ //inlinevoidread128(__int128&n){ //boolf=1;n=0;charch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=!f; //ch=getchar();}while(ch>=&......
  • 针对特种stm32F4板子的串口接线
    硬件接线说明直接采用4针的串口(TXD、RXD、GND、VCC),然后通过CH340芯片进行转换,就可以直接通过USB口转串口的方式达到和计算机通信的目的。如果采用有线方式与PC机进行通信,则需要用到CH340转换芯片,数据会通过USART1串口传输。如果采用无线方式与手机进行通信,则不需要用到CH......
  • luoguP3533 lca
    [POI2012]RAN-Rendezvous题目描述ByteasarisarangerwhoworksintheArrowCave-afamousrendezvousdestinationamonglovers.Thecaveconsistsof\(n\)chambersconnectedwithone-waycorridors.Ineachchamberexactlyoneoutgoingcorridorismarked......
  • QT移植到imx6ull ARM板子上面
    目录前言:1.资料准备:2.编译tslib库3.编译qt库源码4.配置arm板子qt和tslib环境5.qt安装和配置6.新建QT工程7.arm板子运行第一个qt程序8.关闭arm板子出厂gui程序前言:本文章是移植qt库到imx6ull上面能够运行,同时移植tslib库(触摸屏)到imx6ull上面,适用于大部分arm板......