[蓝桥杯学习] 倍增LCA

倍增LCA

LCA就是求公众祖先的问题

在做树的题目时,我们经常要考虑当树为一条链时的情况。

如果树较为均匀,那么我们进行操作的时间复杂度是 O(log n) ;如果一条链的话,时间复杂度变成 O(n) 如果n很大,那么此时,就会超时。

倍增法求LCA

dp 动态规划数组

fa52 = fafa\[51]1 = fa31 = 1

代码结构:

  1. 更新dep
  2. p放入fa
  3. faxi = fafa\[xi-1]i-1
  4. dfs

代码结构:

  1. 将x 设为深度深的那个
  2. 从大到小进行for,if(depfa\[xi] >= depy) x = faxi (跳8没超y就跳,超过了,就跳4,以此类推)
  3. 如果x y相同,就返回 x (这个情况是,y就是x的祖先)
  4. 从大到小进行for, if(faxi != fayi) x=faxi y=fayi (为什么要保持不等:因为尽量跳远的原则,可以跳到相同的点,但是不是最近的祖先。)
  5. 返回fax0

有一道简单的例题

cpp 复制代码
#include <iostream>
#include<vector>
using namespace std;

const int N = 1e6;
vector<int> edge[N];  //放边
int dep[N];  //每个结点的深度
int fa[N][21];

void dfs(int t,int p)
{
  dep[t] = dep[p] + 1;
  fa[t][0]=p;
  for(int i = 1 ; i <= 20 ; i++)
  {
    fa[t][i] = fa[fa[t][i-1]][i-1];
  }
  for(const auto &v : edge[t])
  {
    if(v != p)
    {
      dfs(v,t);
    }
  }
}

int lca(int x,int y)
{
  if(dep[x] < dep[y])
  {
    swap(x,y);
  }
  for(int i = 20 ; i >= 0 ; i--)
  {
    if(dep[fa[x][i]]>=dep[y]) x = fa[x][i];
  }
  if(x==y) return x;
  for(int i = 20 ; i >=0 ; i--)
  {
    if(fa[x][i] != fa[y][i]) 
    {
      x = fa[x][i];
      y = fa[y][i];
    }
  }
  return fa[x][0];
}



int main()
{
  // 用一个fa数组保存树的结点的父亲
  // 用一个dep数组保存各个结点的深度
  int n;
  cin >> n;
  for(int i = 0 ; i < n-1 ; i++)
  {
    int u,v;
    cin >> u >> v;
    edge[u].push_back(v);
    edge[v].push_back(u);
  }
  dfs(1,0);
  int m;
  cin >> m;
  while(m--)
  {
    int x,y;
    cin >> x >> y;
    cout << lca(x,y) << '\n';
    //if(m != 1) cout << '\n';
  }


  return 0;
}
相关推荐
代码山河5 小时前
Python就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
释厄6235 小时前
AI学习层更新与跨体转移律——人类社会同构·不缺理解缺 U
人工智能·学习
小嘉丶学长9 小时前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节
小李不想当小白10 小时前
SPI通信外设与W25Q64 (硬件SPI)(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
adinnet202614 小时前
电商客服对话知识库的自学习闭环与质量演进机制
学习
lazy H14 小时前
【计算机网络】第 13 篇:NAT 和端口映射是什么?为什么本地服务外网访问不了?
java·网络·网络协议·学习·计算机网络·408
试剂界的爱马仕15 小时前
α-Cyano-4-hydroxycinnamic acid(CHCA)用作 MALDI-TOF 基质的配制与使用
大数据·人工智能·深度学习·学习
小向是个Der16 小时前
嵌入式进阶——编译与链接
汇编·单片机·学习·编译原理·交叉编译
学网安的肆伍16 小时前
认证机制攻防学习|PortSwigger Authentication 靶场复现总结(二):用户名枚举进阶
学习·web安全·网络安全·burpsuite·portswigger·认证安全·靶场复现
海绵宝宝转agent16 小时前
Leetcode二叉树算法个人理解
笔记·学习·算法·leetcode·深度优先