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

算法提升之树上问题-(tarjan求LCA)

今天分享的是另一种求解LCA的方法,通过tarjan求解LCA,关键是要理解具体流程图才可以解决这个问题。

1.基本过程(注意自底往上这个细节点)

2.基本代码

问题描述

给定一棵有 N 个节点的树,每个节点有一个唯一的编号,从 1到 N。树的根节点是 1 号节点。接下来,你会得到 Q 个查询。对于每个查询,你将得到两个节点的编号,你的任务是找到这两个节点的最低公共祖先。

输入格式

第一行包含一个整数 N,表示树的节点数。

接下来的 N−1行,每行包含两个整数 U和 V,表示节点 U 和节点 V 之间有一条边。

下一行包含一个整数 Q,表示查询的数量。

接下来的 Q行,每行包含两个整数 A和 B,表示你需要找到节点 A 和节点 B 的最低公共祖先。

输出格式

对于每个查询,输出一行,该行包含一个整数,表示两个节点的最近公共祖先。

输入案例:

5
1 2
1 3
2 4
2 5
3
4 5
3 4
3 5

输出案例

2
1
1

代码部分

#include <bits/stdc++.h>using namespace std;
const int N = 1e5 + 10;
int h[N], e[2 * N], ne[2 * N], idx, n, root, q;
vector<int> p[N], id[N];
int fa[N], ans[N];
bool st[N];
void add(int u, int v) {e[idx] = v;ne[idx] = h[u];h[u] = idx++;
}
int find(int x) {return fa[x] = fa[x] == x ? x : find(fa[x]);
}
void tarjan(int u) {for (int i = 0; i < p[u].size(); i++) {int j = p[u][i];if (st[j]) {ans[id[u][i]] = find(j);}}st[u] = true;for (int i = h[u]; ~i; i = ne[i]) {int j = e[i];if (st[j]) continue;tarjan(j);fa[j] = u;}
}
int main() {memset(h, -1, sizeof h);cin >> n;for (int i = 1; i <= n; i++) fa[i] = i;for (int i = 0; i < n - 1; i++) {int u, v;cin >> u >> v;add(u, v), add(v, u);}cin >> q;for (int i = 0; i < q; i++) {int a, b;cin >> a >> b;if (a == b) ans[i] = a;else {p[a].push_back(b), p[b].push_back(a);id[a].push_back(i), id[b].push_back(i);}}tarjan(1);for (int i = 0; i < q; i++) cout << ans[i] << '\n' ;return 0;
}

今天的分享就到这里,希望大家可以多多关注,后续也将继续相关内容学习。

http://www.lryc.cn/news/622696.html

相关文章:

  • 基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
  • MySQL 配置性能优化赛技术文章
  • Win10、Win11电脑之间无法Ping通解决办法
  • 设计模式之【快速通道模式】,享受VIP的待遇
  • Python - 100天从新手到大师:第十一天常用数据结构之字符串
  • OpenCV Python——图像拼接(一)(图像拼接原理、基础知识、单应性矩阵 + 图像变换 + 拼接)
  • redis基本类型之哈希
  • 爬机 验证服务器是否拒绝请求
  • 衡石使用指南嵌入式场景实践之仪表盘嵌入
  • 【Docker项目实战】使用Docker部署Notepad轻量级记事本
  • 《吃透 C++ 类和对象(中):const 成员函数与取地址运算符重载解析》
  • js原生实现手写签名与使用signature_pad库实现手写签名
  • 【Java Web 快速入门】十一、Spring Boot 原理
  • Flutter开发 网络请求
  • Flutter InheritedWidget 详解:从生命周期到数据流动的完整解析
  • Flutter Provider 模式实现:基于 InheritedWidget 的状态管理实现
  • SQL183 近三个月未完成试卷数为0的用户完成情况
  • 力扣(LeetCode) ——142. 环形链表 II(C语言)
  • JavaWeb 30 天入门:第十一天 ——Java 反射机制详解
  • 【环境变量与程序地址空间详解】
  • vue3动态的控制表格列的展示简单例子
  • 从希格斯玻色子到 QPU:C++ 的跨维度征服
  • KingbaseES高可用架构深度解析——从读写分离到异地灾备的全方位守护
  • 【C++】异常详解(万字解读)
  • 力扣hot100 | 矩阵 | 73. 矩阵置零、54. 螺旋矩阵、48. 旋转图像、240. 搜索二维矩阵 II
  • [1Prompt1Story] 生成行为控制器 | 语义向量重加权(SVR)
  • 第七十五章:AI的“思维操控师”:Prompt变动对潜在空间(Latent Space)的影响可视化——看懂AI的“微言大义”!
  • Netty 的 Select/Poll 机制核心实现主要在 NioEventLoop 的事件循环
  • Horse3D游戏引擎研发笔记(六):在QtOpenGL环境下,仿Unity的材质管理Shader绘制四边形
  • Nginx域名和IP兼容双方的API地址