当前位置: 首页 > article >正文

算法提高模板LCA

在这里插入图片描述

模板:

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
const int MOD = 998244353;
const int N = 2e5 + 10;

int n, m, s, a, b;
vector<int>e[N];
int dep[N], fa[N][20];//深度
//第u个节点向上走2的i次方之后所对应的祖先
void dfs(int u, int father)
{
	dep[u] = dep[father] + 1;
	fa[u][0] = father;//初始化递归的第一项
	for(int i = 1; i <= 19; i ++)
	{
		fa[u][i] = fa[fa[u][i - 1]][i - 1];
	}
	for(int v : e[u])
	{
		if(v != father) dfs(v, u);
	}
}

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];
}
int main()
{
	cin >> n;
	while(n --){
		cin >> a >> b;
		if(b == -1) s = a;
		else {
			e[a].push_back(b);
			e[b].push_back(a);
		}
		
	}
	dfs(s, 0);
	cin >> m;
	
	while(m --){
		cin >> a >> b;
		int o = lca(a, b);
		
		if(o == a) cout << 1 << endl;
		else if(o == b) cout << 2 << endl;
		else cout << 0 << endl;
	}
	return 0;
}


http://www.kler.cn/a/303555.html

相关文章:

  • 数据分析-48-时间序列变点检测之在线实时数据的CPD
  • Qt文件目录操作
  • Array数组方法
  • 计算机毕业设计Python+大模型中医养生问答系统 知识图谱 医疗大数据 中医可视化 机器学习 深度学习 人工智能 大数据毕业设计
  • 《TCP/IP网络编程》学习笔记 | Chapter 10:多进程服务器端
  • 蓝桥杯竞赛单片机组备赛【经验帖】
  • Unity Behavior Designe 可视化有限状态机(Composites篇)
  • Docker和Docker-compose
  • LSS如何创建视锥
  • HAL库学习梳理——UART
  • HarmonyOS NEXT应用开发性能实践总结
  • 太牛了!顺丰丰语大语言模型:已应用于20余个场景
  • 数据结构实验1
  • 电力系统调度控制台的功能有哪些
  • 【devops】devops-git之介绍以及日常使用
  • Winform中引入WPF控件后键盘输入无响应
  • Vue.js 中的 DOM 更新之后执行某些操作
  • uniapp与webview直接进行传值
  • vscode ssh离线远程连接ubuntu调试
  • python学习第九节:爬虫实战-抓取地址库
  • C语言 12 函数
  • Java二级信息收集
  • yarn webpack脚手架 react+ts搭建项目
  • ELK 架构中 ES 性能优化
  • 简单聊聊bait文件
  • 班组建设中如何避免团队协作的问题?