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

图论————最近公共祖先(LCA)

方法:

1.标记法:

(1)将u到根节点的路径标记一遍

(2)将v到根节点的路径走一遍如果与u标记的路径相重合,则重合点为两者公共祖先

2.跳跃法:

(1)先让其中一个节点跳到另一个的同一深度
(2)两个一起跳,直到找到共同祖先

代码如下:

vector<int> g[500010]; //存节点 int d[500010]; //节点深度 int f[500010]; //节点父亲 void dfs(int u,int fa){ //计算节点深度和父节点 d[u]=d[fa]+1; f[u]=fa; for(int i=0;i<g[u].size();i++){ int v=g[u][i]; if(v==fa){ continue; } dfs(v,u); } } int lca(int u,int v){ if(d[u]<d[v]){ //保证u最深 swap(u,v); } int cha=d[u]-d[v]; for(int i=1;i<=cha;i++){ //保证让两个节点在同一深度 u=f[u]; } while(u!=v){ //两个节点同时向上爬 u=f[u]; v=f[v]; } return u; //此时u和v就都是他俩的公共祖先 }

(3)利用二进制优化跳跃的过程:

状态:father[i][j]表示以i开始,长度为2^j的父亲

模板题:

P3379 P3379 【模板】最近公共祖先(LCA) - 洛谷

程序模板:

#include<bits/stdc++.h> using namespace std; int n,m,s; vector<int> g[500010]; int d[500010]; int father[500010][25]; void dfs(int u,int fa,int depth){ father[u][0]=fa; for(int i=1;i<=20;i++){ father[u][i]=father[father[u][i-1]][i-1]; } d[u]=depth; for(int i=0;i<g[u].size();i++){ int v=g[u][i]; if(v==fa) continue; dfs(v,u,depth+1); } } int lca(int a,int b){ if(d[a]<d[b]){ swap(a,b); } for(int k=20;k>=0;k--){ if(d[father[a][k]]>=d[b]){ a=father[a][k]; } } if(a==b){ return a; } for(int k=20;k>=0;k--){ if(father[a][k]!=father[b][k]){ a=father[a][k]; b=father[b][k]; } } return father[a][0]; } int main(){ cin>>n>>m>>s; for(int i=1;i<n;i++){ int x,y; cin>>x>>y; g[x].push_back(y); g[y].push_back(x); } dfs(s,0,1); while(m--){ int a,b; cin>>a>>b; cout<<lca(a,b)<<endl; } return 0; }

感谢观看!

http://www.jsqmd.com/news/602272/

相关文章:

  • 保姆级教程:在Win11专业版23H2上,用BitLocker给U盘加密(附忘记密码恢复指南)
  • 聊聊常州哪里买黄金支持全国复检,靠谱品牌有哪些 - mypinpai
  • 上下文200万Tokens:AI编程进入“项目级“时代
  • 如何快速上手openpilot:新手必看的5大实用技巧指南
  • JsonPath学习
  • 别再为标注格式发愁了!一份Python脚本搞定CrowdHuman转YOLO格式(附完整代码与避坑点)
  • Flowable31动态表单实战:从外置表单设计到Vue动态路由集成
  • 快速上手AI绘画:用SDXL 1.0电影级绘图工坊生成你的第一张赛博朋克图
  • 2026年常州哪里黄金加工工艺精细靠谱推荐,能否少花冤枉钱 - 工业设备
  • 实战演练,基于快马生成stm32f103c8t6引脚驱动dht11并上传mqtt的代码
  • 基于列约束生成法(CCG)的两阶段鲁棒优化模型求解代码功能说明
  • 2026年度京津冀靠谱全域全渠道文旅电商与诚信智能化SRM解决方案服务商排名 - mypinpai
  • 5步轻松搞定网页资源抓取:猫抓浏览器扩展的完整实战指南
  • 差速器行星齿轮机加工工艺及工序卡
  • 终极指南:如何用Ventoy从RAID阵列轻松启动系统
  • 【IHAOAVOA】基于混合优化算法实例分析
  • YOLO12与OpenCV的实时图像处理系统
  • 2026年4月OpenClaw如何安装?华为云小白指南:搭建及大模型API、Skill配置
  • 佳能G1800 G2800 G3800 TS3380 打印机清零软件,报错5b00,5b01,5b02,5b04,p07,1700,亲测好用,推荐
  • 轻量级华硕硬件控制工具:GHelper如何重新定义笔记本性能管理
  • OpCore Simplify智能配置黑苹果的终极指南:15分钟完成OpenCore EFI一键生成
  • 基于卷积神经网络的SenseVoice-Small语音识别优化指南
  • FlowState Lab结合正则表达式:复杂文本模式的提取与生成
  • 告别 Mac mini 挂机,千元级AI边缘计算机让 Clawdbot 7×24 小时稳定值守
  • 实战演练:基于claude与快马平台,从零构建可部署的电商购物车系统
  • OpenClaw技能扩展指南:用百川2-13B-4bits量化模型开发自定义自动化
  • 2026广东翡翠实测封神!5款佛山白底青白月光手镯/高冰飘花手镯源头工厂性价比高口碑好 - 十大品牌榜
  • Unity Animator实战:如何用Blend Tree实现角色平滑过渡动画(附完整代码)
  • 3步掌控硬件:如何用轻量级硬件控制工具释放笔记本潜能?
  • STM32双机蓝牙通信:主从模块AT指令实战配置指南