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

acwing算法提高之图论--最近公共祖先

目录

  • 1 介绍
  • 2 训练

1 介绍

本博客用来记录"对于有根图中,求最近公共祖先"的题目。

求解方法:

  1. 向上标记法。每次求两个结点的最近公共祖先的时间复杂度是O(N)。由于时间复杂度较高,通常不用。
  2. 倍增法。

倍增法重要思路:预处理出两个数组fa[i][j]depth[i]。其中fa[i][j]表示从i开始,向上走2^j步所能走到的结点。0<=j<=logndepth[i]表示深度,为到根结点的距离再加上1。

哨兵:如果从i开始跳2^j步会跳过根结点,那么fa[i][j] = 0depth[0] = 0

倍增法重要步骤:

  1. 先将两个点跳到同一层。
  2. 让两个点同时往上跳,一直跳到它们的最近公共祖先的下一层。

倍增法的时间复杂度分析:预处理的时间复杂度为O(NlogN),查询的时间复杂度为O(logN)

2 训练

题目1:1172祖孙询问

C++代码如下,

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <unordered_map>using namespace std;const int N = 40010;
int n, m;
int depth[N], fa[N][16];
int ancestor;
unordered_map<int, vector<int>> g;void bfs(int root) {memset(depth, 0x3f, sizeof depth);depth[0] = 0;depth[root] = 1; queue<int> q;q.push(root);while (!q.empty()) {int a = q.front();q.pop();for (auto b : g[a]) {if (depth[b] > depth[a] + 1) {depth[b] = depth[a] + 1;q.push(b);fa[b][0] = a;for (int k = 1; k <= 15; ++k) {fa[b][k] = fa[fa[b][k-1]][k-1];}}}}return;
}int lca(int a, int b) {//倍增法if (depth[a] < depth[b]) swap(a, b);for (int k = 15; k >= 0; --k) {if (depth[fa[a][k]] >= depth[b]) {a = fa[a][k];}}if (a == b) return a;for (int k = 15; k >= 0; --k) {if (fa[a][k] != fa[b][k]) {a = fa[a][k];b = fa[b][k];}}return fa[a][0];
}int main() {cin >> n;int a, b;for (int i = 0; i < n; ++i) {cin >> a >> b;if (b == -1) {ancestor = a;} else {g[a].emplace_back(b);g[b].emplace_back(a);        }}cin >> m;vector<pair<int,int>> queries;for (int i = 0; i < m; ++i) {cin >> a >> b;queries.emplace_back(a,b);}//从根结点开始遍历bfs(ancestor);for (auto [a, b] : queries) {int x = lca(a, b);if (a == x) {puts("1");} else if (b == x) {puts("2");} else {puts("0");}}return 0;
}

题目2:1171距离

C++代码如下,


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

相关文章:

  • C语言 函数——断言与防御式编程
  • 【opencv】示例-travelsalesman.cpp 使用模拟退火算法求解旅行商问题
  • 【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用
  • xss常用标签和触发事件
  • WPF中Binding的原理和应用
  • 探索设计模式的魅力:深度挖掘响应式模式的潜力,从而精准优化AI与机器学习项目的运行效能,引领技术革新潮流
  • 《经典论文阅读2》基于随机游走的节点表示学习—Deepwalk算法
  • Java实现二叉树(下)
  • Hello 算法10:搜索
  • 常见分类算法详解
  • 推送恶意软件的恶意 PowerShell 脚本看起来是人工智能编写的
  • 微服务之Consul 注册中心介绍以及搭建
  • MES生产管理系统:私有云、公有云与本地化部署的比较分析
  • 【core analyzer】core analyzer的介绍和安装详情
  • 个人练习之-jenkins
  • 初探vercel托管项目
  • 软考 - 系统架构设计师 - 质量属性例题 (2)
  • 基于Python豆瓣电影数据可视化分析系统的设计与实现
  • 【已开源】​基于stm32f103的爬墙小车
  • PCL 基于马氏距离KMeans点云聚类
  • libVLC 视频窗口上叠加透明窗口
  • MySQL基础入门上篇
  • Docker搭建FFmpeg
  • Hudi-ubuntu环境搭建
  • Hive进阶Day05
  • ssh爆破服务器的ip-疑似肉鸡
  • 4.JVM八股
  • 内网渗透系列-mimikatz的使用以及后门植入
  • 5G网络开通与调测ipv4
  • Spark开窗函数之ROW