最近公共祖先(倍增,tarjan,树链剖分)

两个点的最近公共祖先,即两个点的所有公共祖先中,离根节点最远的一个节点。

倍增算法

在这里插入图片描述
1.dfs一遍,创建ST表
在这里插入图片描述
2.利用ST表求LCA
在这里插入图片描述

内容来源 D09 倍增算法 P3379【模板】最近公共祖先(LCA)

#include<iostream>
#include<vector>
using namespace std;
#define MAX_N 500000
int n,m,s;
vector<int>e[MAX_N+5];
int dep[MAX_N+5];
int fa[MAX_N+5][20];
void dfs(int now,int father)
{dep[now]=dep[father]+1;fa[now][0]=father;//向上跳1,2,4...步的祖先节点 for(int i=1;i<=19;i++)fa[now][i]=fa[fa[now][i-1]][i-1];for(int v:e[now]){if(v==father)continue;dfs(v,now);}return ;
}
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 u;//再跳到lca的下一层 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>>m>>s;for(int i=1,a,b;i<=n-1;i++){scanf("%d%d",&a,&b);e[a].push_back(b);e[b].push_back(a);}dfs(s,0);for(int i=1,a,b;i<=m;i++){scanf("%d%d",&a,&b);printf("%d\n",lca(a,b));}return 0;
} 

Tarjan算法

在这里插入图片描述
内容来源 D10 Tarjan算法 P3379【模板】最近公共祖先(LCA)

#include<iostream>
#include<vector>
using namespace std;
#define MAX_N 500000
int n,m,s;
vector<int>e[MAX_N+5];
vector<pair<int,int>>query[MAX_N+5];
int fa[MAX_N+5];
int vis[MAX_N+5];
int ans[MAX_N+5];
int find(int x)
{return fa[x]=(fa[x]==x?x:find(fa[x]));
}
void tarjan(int u)
{vis[u]=1;//入u时,标记u for(auto v:e[u]){if(vis[v])continue;tarjan(v);fa[v]=u;//回u时,v指向u }for(auto q:query[u])//离u时,枚举lca {int v=q.first,t=q.second;if(vis[v])ans[t]=find(v);}return ;
}
int main()
{cin>>n>>m>>s;for(int i=1,a,b;i<=n-1;i++){scanf("%d%d",&a,&b);e[a].push_back(b);e[b].push_back(a);}for(int i=1,a,b;i<=m;i++){scanf("%d%d",&a,&b);query[a].push_back({b,i});query[b].push_back({a,i});}for(int i=1;i<=n;i++)fa[i]=i;tarjan(s);for(int i=1;i<=m;i++)printf("%d\n",ans[i]);return 0;
} 

树链剖分算法

在这里插入图片描述
在这里插入图片描述
内容来源 D11 树链剖分 P3379【模板】最近公共祖先(LCA)

#include<iostream>
#include<vector>
using namespace std;
#define MAX_N 500000
int n,m,s;
vector<int>e[MAX_N+5];
int fa[MAX_N+5],sz[MAX_N+5],son[MAX_N+5],dep[MAX_N+5];
int top[MAX_N+5];
void dfs1(int u,int father)//搞fa,son,dep 
{fa[u]=father;dep[u]=dep[father]+1;sz[u]=1;for(int v:e[u]){if(v==father)continue;dfs1(v,u);sz[u]+=sz[v];if(sz[son[u]]<sz[v])son[u]=v;}return ;
}
void dfs2(int u,int t)//搞top 
{top[u]=t;//记录链头 if(!son[u])return ;//无重儿子 dfs2(son[u],t);//搜重儿子 for(int v:e[u]){if(v==fa[u]||v==son[u])continue;dfs2(v,v);//搜轻儿子 }return ;
}
int lca(int u,int v)
{while(top[u]!=top[v]){if(dep[top[u]]<dep[top[v]])swap(u,v);u=fa[top[u]];}return dep[u]<dep[v]?u:v;
}
int main()
{cin>>n>>m>>s;for(int i=1,a,b;i<=n-1;i++){scanf("%d%d",&a,&b);e[a].push_back(b);e[b].push_back(a);}dfs1(s,0);dfs2(s,s);for(int i=1,a,b;i<=m;i++){scanf("%d%d",&a,&b);printf("%d\n",lca(a,b));}return 0;
} 

总结

        倍增算法  T a r j a n Tarjan Tarjan算法树链剖分
数据结构 f a [ u ] [ i ] , d e p [ u ] fa[u][i],dep[u] fa[u][i],dep[u] f a [ u ] , v i s [ u ] , q u e r y [ u ] , a n s [ i ] fa[u],vis[u],query[u],ans[i] fa[u],vis[u],query[u],ans[i] f a [ u ] , d e p [ u ] , s z [ u ] , s o n [ u ] , t o p [ u ] fa[u],dep[u],sz[u],son[u],top[u] fa[u],dep[u],sz[u],son[u],top[u]
算法倍增法 深搜打标,跳跃查询并查集 深搜,回时指父,离时搜根重链剖分 两边深搜打表,跳跃查询
时间复杂度 O ( ( n + m ) l o g n ) O((n+m)logn) O((n+m)logn) O ( n + m ) O(n+m) O(n+m) O ( n + m l o g n ) O(n+mlogn) O(n+mlogn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/862908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

特斯拉下一代自动驾驶芯片的深度预测

引言 特斯拉一直以来都在自动驾驶技术上不断突破&#xff0c;随着AI大模型技术的爆发&#xff0c;其下一代自动驾驶芯片&#xff08;HW5.0&#xff09;也备受瞩目。本文将深入分析和预测特斯拉下一代自动驾驶芯片AI5的技术特点及其对行业的影响。 深入技术分析 现有自动驾驶…

React小记(五)_Hooks入门到进阶

React 16.8 版本 类组件 和 函数组件 两种组件共存&#xff0c;到目前 React 18 版本&#xff0c;官方已经不在推荐使用类组件&#xff0c;在函数组件中 hooks 是必不可少的&#xff0c;它允许我们函数组件像类组件一样可以使用组件的状态&#xff0c;并模拟组件的生命周期等一…

高效数据采集监控平台 一体化平台 数据可视化!

提高工作效率&#xff0c;一直是各种厂家在寻找的方法。任何一种有效且实用的方法都值得去尝试。数据采集监控平台是一种能高效处理数据的方式&#xff0c;其主要工作内容是从各个产生数据的仪器设备传感器中采集数据、对数据进行集中整理整合、分析、显示、绘制图表、存储、传…

java基于ssm+jsp 扶贫惠农推介系统

1管理员功能模块 管理员输入个人的用户名、密码、角色登录系统&#xff0c;这时候系统的数据库就会在进行查找相关的信息&#xff0c;如果我们输入的用户名、密码不正确&#xff0c;数据库就会提示出错误的信息提示&#xff0c;同时会提示管理员重新输入自己的用户名、密码&am…

DigiRL:让 AI 自己学会控制手机

类似于苹果此前发布的Ferret-UI 的安卓开源平替。主要用于在 Android 设备上识别 UI 和执行指令&#xff0c;不同的是它利用了离线到在线强化学习&#xff08;Offline-to-Online RL&#xff09;&#xff0c;能够快速适应应用更新或 UI 变化。

麒麟桌面系统CVE-2024-1086漏洞修复

原文链接&#xff1a;麒麟桌面操作系统上CVE-2024-1086漏洞修复 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在麒麟桌面操作系统上修复CVE-2024-1086漏洞的文章。漏洞CVE-2024-1086是一个新的安全漏洞&#xff0c;如果不及时修复&#xff0c;可能会对系统造成安全…

Windows和Linux C++判断磁盘空间是否充足

基本是由百度Ai写代码生成的&#xff0c;记录一下。实现此功能需要调用系统的API函数。 对于Windows&#xff0c;可调用函数GetDiskFreeSpaceEx&#xff0c;使用该函数需要包含头文件windows.h。该函数的原型&#xff1a; 它的四个参数&#xff1a; lpDirectoryName&#xff0…

自然语言处理-BERT处理框架-transformer

目录 1.介绍 2.Transformer 2.1 引言 2.2 传统RNN网络的问题 2.3 整体架构 2.4 Attention 2.5 Self-Attention如何计算 3.multi-headed机制 4. BERT训练方法 1.介绍 BERT&#xff1a;当前主流的解决框架&#xff0c;一站式搞定NLP任务。&#xff08;解决一个NLP任务时的考虑…

人工智能设备pbootcms网站模板源码

模板介绍 人工智能行业发展趋势不断攀升逐渐成为了新业态&#xff0c;小编精心为大家收集整理了一款HTML5人工智能设备pbootcms网站模板整站源码下载&#xff0c;可帮助您快速建站以展示企业的产品与业务&#xff0c;响应式自适应设计也会适配所有浏览设备。 模板截图 源码下…

文心一言4.0免费使用

领取&安装链接&#xff1a;Baidu Comate 领取季卡 有图有真相 原理&#xff1a;百度comate使用文心一言最新的4.0模型。百度comate目前免费使用&#xff0c;可以借助comate达到免费使用4.0模型目的。 如何获得 点击「Baidu Comate 领取季卡 -> 领取权益」&#xff0…

静态链表详解(C语言版)

顺序表和链表的优缺点 顺序表和链表是两种基本的线性数据结构&#xff0c;它们各自有不同的优缺点&#xff0c;适用于不同的应用场景。 顺序表&#xff08;Sequential List&#xff0c;通常指数组&#xff09; 优点&#xff1a; 随机访问&#xff1a;可以通过索引快速访问任…

使用Endnote中英文等的实现和GB7714格式

Endnote是一款被广泛使用的文献管理软件&#xff0c;其是SCI&#xff08;Thomson Scientific 公司&#xff09;的官方软件&#xff0c;支持国际期刊的参考文献格式有3776 种【也可以自定义期刊引用格式】。 软件非常方便科研狗进行文献整理&#xff0c;写笔记&#xff0c;做备…

Vue.js中的计算属性:如何让数据自动更新

引言 在Vue.js的世界里&#xff0c;computed属性就像是你的智能助手&#xff0c;它能自动追踪变化&#xff0c;帮你快速做出反应。想象一下&#xff0c;你在做一道菜&#xff0c;调料&#xff08;数据&#xff09;一变&#xff0c;味道&#xff08;界面&#xff09;立刻跟上。…

visual studio打包QT工程发布exe安装包

一、实验环境 软件版本下载链接visual studioMicrosoft Visual Studio Community 2022 (64 位) - Current 版本 17.7.5QTv6.6.3NSISv3.10官网 或 百度云1234Windows11 二、程序准备 1、程序生成 使用 visual studio 打开工程&#xff0c;选择 Release 模式后&#xff0c;点…

学生宿舍管理系统

摘 要 随着高校规模的不断扩大和学生人数的增加&#xff0c;学生宿舍管理成为高校日常管理工作中的重要组成部分。传统的学生宿舍管理方式往往依赖于纸质记录和人工管理&#xff0c;这种方式不仅效率低下&#xff0c;而且容易出错&#xff0c;无法满足现代高校管理的需求。因此…

金融科技:重塑用户体验,驱动满意度飙升

随着科技的飞速发展&#xff0c;金融科技&#xff08;FinTech&#xff09;已经深入到我们生活的每一个角落&#xff0c;从日常支付到投资理财&#xff0c;再到跨境汇款&#xff0c;它都在悄无声息地改变着我们的金融行为。而在这背后一个不可忽视的驱动力就是金融科技对用户体验…

NoSQL之Redis集群--主从复制、哨兵模式、群集模式

目录 一、三大高可用方案 二、Redis 主从复制 1.主从复制的作用 2.主从复制流程 3.搭建Redis 主从复制 三、Redis 哨兵模式 1.哨兵的核心功能 2.哨兵模式的作用 3.哨兵结构组成 4.故障转移机制 5.主节点的选举 6.搭建Redis 哨兵模式 四、Redis 群集模式 1.概念 …

GIT版本管理工具轻松入门 | TortoiseGit

目录 一、下载git 二、下载tortoisegit&#xff08;可视化git&#xff09; 三、Git本地仓库创建 四、git克隆 五、添加&#xff0c;提交&#xff0c;推送&#xff0c;拉取 六、分支 七、冲突 八、忽略文件&#xff08;修改gitignore文件&#xff09; 一、下载git 安装…

大数据信用报告查询应该选什么样的平台?

随着大数据技术的不断发展&#xff0c;大数据信用报告查询平台也应运而生。这些平台通过数据挖掘和分析&#xff0c;为个人提供有关大数据信用的详细报告&#xff0c;帮助他们在做出决策时获得更多的信息。然而&#xff0c;面对众多的大数据信用报告查询平台&#xff0c;如何选…

Qt信号槽的坑

1、重载的信号&#xff08;以QSpinBox为例&#xff09; 像是点击按钮之类的信号槽很好连接&#xff0c;这是因为它的信号没有重载&#xff0c;如果像SpinBox那样有重载信号的话&#xff08;Qt5.12的见下图&#xff0c;不过Qt5.15LTS开始就不再重载而是换信号名了&#xff09;&…