【董晓算法】竞赛常用知识之图论3(最近公共祖先)

前言:

本系列是学习了董晓老师所讲的知识点做的笔记

董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com)

 动态规划系列(还没学完)

【董晓算法】动态规划之线性DP问题-CSDN博客

【董晓算法】动态规划之背包DP问题(2024.5.11)-CSDN博客

【董晓算法】动态规划之背包DP与树形DP-CSDN博客

字符串系列()

【董晓算法】竞赛常用知识之字符串1-CSDN博客

【董晓算法】竞赛常用知识之字符串2-CSDN博客

数据结构系列(未学完)

【董晓算法】竞赛常用知识点之数据结构1-CSDN博客

搜索系列

[董晓算法]搜索相关题目及模板-CSDN博客

图论系列 

【董晓算法】算法知识之图论1(拓扑排序,多种最短路算法)-CSDN博客

【董晓算法】竞赛常用知识之图论2(最小环,最小生成树)-CSDN博客

最近公共祖先

倍增算法

倍增算法是最经典的求 LCA 算法
dep]存u点的深度。fa[u][i] 存从 u 点向上跳 2 层的祖先结点。

步骤:

1.dfs 一遍,创建 ST 表(倍增递推,fa[u][i]=fa[fa[u][i-1]][i-1])

2.利用 ST 表求 LCA

const int N=5e5+10;
int n,m,s;
vector<int> e[N];
int dep[N],fa[N][22];void dfs(int u,int father){ //树增dep,fadep[u]=dep[father]+1; fa[u][0]=father;for(int i=1; i<=20; i++) fa[u][i]=fa[fa[u][i-1]][i-1]; for(int v : e[u])if(v!=father) dfs(v,u);
}
int lca(int u,int v){ //树增lcaif(dep[u]<dep[v]) swap(u,v);//先跳到同一层for(int i=20; i>=0; i--)if(dep[fa[u][i]]>=dep[y]) u=fa[u][i];if(u==v) return v;for(int i=20; i>=0; i--)if(fa[u][i]!=fa[v][i]) x=fa[u][i],y=fa[v][i];return fa[u][0];
}

Tarjan 算法

Tarjan(塔扬)算法是一种离线算法,巧妙利用并查集维护祖先结点

1.从根开始深搜遍历,入u时 打标记

2.枚举u的儿子v、遍历完v的子树,回u时 把v指向 u。

3.遍历完u的儿子们,离u时 枚举以 u为起点的查询,若终点 v被搜过则查找 v的根,即 uv 的 LCA,答案记入 ans0。

4.递归遍历完整颗树,得到全部查询答案。

 i是第i个查询 

vector<int> e[N];
vector<pair<int,int>>query[N];
int fa[N],vis[N],ans[M]; 
int find(int u){if(u==fa[u]) return u;return fa[u]=find(fa[u]);
}
void tarjan(int u){vis[u]=true;//标记u已访问for(auto y : e[u]){if(!vis[y]){tarjan(y);fa[y]=u;//回到u时v指向u    }        }//离开u时找LCAfor(auto q : query[u]){int y=q.first,i=q.second;if(vis[y])ans[i]=find(y);}
}

树链剖分

概念

  1. 重儿子:父结点的所有儿子中子树结点数目最多的结点
  2. 轻儿子:父结点中除重儿子以外的儿子
  3. 重边:父结点和重儿子连成的边
  4. 轻边:父结点和轻儿子连成的边
  5. 重链:由多条重边连接而成的路径

1.整棵树会被剖分成若干条重链。

2.轻儿子一定是每条重链的顶点。

3.任意一条路径被切分成不超过 logn 条链

流程

1.第一遍 dfs,搞出 fa.dep.son 数组
2.第二遍 dfs,搞出 top 数组
3.让两个游标沿着各自的重链向上跳,跳到同一条重链上时,深度较小的那个游标所指向的点,就是 LCA

vector<int> e[N];
int fa[N],son[N],dep[N],siz[N];
int top[N];
void dfs1(int u,int father){ //搞fa,dep,son son存u的重儿子fa[u]=father;dep[u]=dep[father]+1;siz[u]=1;for(int v:e[u]){if(v==father) continue;dfs1(v,u);siz[u]+=siz[v];if(siz[son[u]]<siz[v])son[u]=v;}
}
void dfs2(int u,int t){ //搞toptop[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); //搜轻儿子}
}
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;
}

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

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

相关文章

智能锁千千万,谁是你的NO.1,亲身实测凯迪仕传奇大师K70旗舰新品

智能锁千千万&#xff0c;谁是你的NO.1。欢迎来到智哪儿评测室&#xff0c;这次我们为大家带来了凯迪仕传奇大师K70系列的一款重磅新品。 在科技的浪潮中&#xff0c;家居安全领域正经历着前所未有的变革。智能锁越来越成为家的安全守护神&#xff0c;以及智能生活的得力助手。…

Android 11 Framework实时监听Activity堆栈变化

核心类 Framework中有一个类SystemActivityMonitoringService专门用于监控Activity堆栈变化&#xff0c;属于隐藏Api&#xff0c;应用侧无法调用。此类位于 packages/services/Car/service/src/com/android/car/SystemActivityMonitoringService.java 方法 void registerTa…

Mysql信息脱敏

类似微信姓名脱敏&#xff1a; SELECT CONCAT( REPEAT(*, CHAR_LENGTH(real_name) -1 ), RIGHT(real_name, 1) ) name from user_info电话号脱敏&#xff1a; SELECT CONCAT(LEFT(mobile_phone, 3), REPEAT(*, 4 ), RIGHT(mobile_phone, 4) ) phone from user_info

大数据Hive中的UDF:自定义数据处理的利器(下)

在上一篇文章中&#xff0c;我们对第一种用户定义函数&#xff08;UDF&#xff09;进行了基础介绍。接下来&#xff0c;本文将带您深入了解剩余的两种UDF函数类型。 文章目录 1. UDAF1.1 简单UDAF1.2 通用UDAF 2. UDTF3. 总结 1. UDAF 1.1 简单UDAF 第一种方式是 Simple(简单…

每日一题《leetcode--382.链表随机结点》

https://leetcode.cn/problems/linked-list-random-node/ 这道题我们首先看到题目中的要求&#xff1a;在单链表中随机选取一个链表中的结点&#xff0c;要使每个结点被选取的概率是一样的。 当我们看到随机这两个字时&#xff0c;应该就会想起rand()这个函数。接着我们把使用这…

[晕事]今天做了件晕事35 VM发送给gateway太多ARP,导致攻击检查?

最近遇到一个问题&#xff0c;说网关学不到新起来VM的mac地址&#xff0c;通过tshark抓包发现&#xff0c;VM已经发出去GARP了。而且连续发送了24个GARP。 就认为是网关的问题&#xff0c;为什么没网关没有学到&#xff1f;就让测试同事开网络设备的ticket。 后来听同事说&…

自己搭建内网穿透

本文介绍使用最新版frp搭建内网穿透&#xff0c;最新版本的frp在配置上与之前有很大不同&#xff0c;需要使用.toml文件进行配置。其中主要问题出现在toml文件内部。 一、云服务器配置 下载frp sudo apt update sudo apt install wget wget https://github.com/fatedier/frp…

求出这行英文中最后一个单词的长度

【题目描述】蓝宝看到了一行奇怪的英文&#xff0c;这行英文由若干单词组成&#xff0c;每个单词前后用一些字符*隔开请帮助蓝宝求出这行英文中最后一个单词的长度。【输入格式】 输入一行&#xff0c;就就是蓝宝看到的奇怪的英文。 【输出格式】 输出一行&#xff0c;是个整数…

文旅3d仿真数字人形象为游客提供全方位的便捷服务

在AI人工智能与VR虚拟现实技术的双重驱动下&#xff0c;文旅3D数字代言人正以其独特的魅力&#xff0c;频频亮相于各类文旅场景&#xff0c;为游客带来前所未有的个性化服务体验。他们不仅有趣有品&#xff0c;更能言善道&#xff0c;成为文旅业数字化发展的新亮点。 这些文旅3…

Android 文件加密解密(AES)

private static final String ALGORITHM "AES"; 文件加密 /*** 文件加密* param secretKey 文件加密密钥* param oldFiles 原始文件列表&#xff0c;需要加密的* param newFiles 构造加密后的文件列表*&#xff08;选择多个或者单个&#xff09;多个文件加密*/ Re…

我的文章分类合集目录

文章目录 Java相关基础常规问题类Docker类RabbitMQ类分库分表 网络工程相关路由交换、Cisco Packet TracerIP地址 前端相关数据库 Java相关 基础 Java开发规范、项目开发流程 SpringBoot整合MyBatis实现增删改查(简单,详细) SpringBoot整合MybatisPlus&#xff08;详细&#…

【Muduo】TcpConnection类

Muduo网络库的TcpConnection类代表了TCP连接的一端&#xff0c;即服务器与远程对等端之间的连接。TcpConnection类知道自身和对端的InetAddress、封装了前面讲过的Socket类和Channel类&#xff0c;并且保有管理自己的subLoop指针&#xff0c;还有多种事件处理函数和回调&#x…

【搜索】BFS

#include <iostream> #include <cstring> #include <queue>using namespace std;const int N 110;typedef pair<int, int> PII;int n, m; int g[N][N], d[N][N];//存放地图//存每一个点到起点的距离int bfs() {queue< PII > q;q.push({0, 0});m…

C语言什么是位段?其优点是什么?

一、问题 在内存中&#xff0c;1byte 8bit&#xff0c;即 1 字节等于 8 位。位由两个值组成&#xff0c;即 0 和 1 。因此&#xff0c;存储在计算机中的 1 字节&#xff0c;可以看成是8个⼆进制数字&#xff08;0 和1&#xff09;组成的串。了解了内存空间的最⼩单位&#xff…

16.js数学方法和进制转换

数学方法 &#xff08;1&#xff09;Math.random() 默认生成0-1的随机数 var resMath.random() console.log(res) &#xff08;2&#xff09;Math.round(数字) 取整&#xff1a;正数-四舍五入 负数-5舍6入 var resMath.round(11)console.log(res) //11var res1Math.round(1…

Aerospike设置日志按日期保存及日志保存日期

配置文件位置&#xff1a;/etc/aerospike/aerospike.conf 是Aerospike的主配置文件&#xff0c;其中包含了日志配置以及其他各种设置。 日志配置&#xff1a;在aerospike.conf文件中&#xff0c;找到logging部分进行配置。以下是一个示例配置&#xff1a; logging { # 日志文…

CentOS7安装内网穿透实现远程推送镜像到本地Docker Registry

文章目录 前言1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址 前言 本文主要介绍如何部署Docker Registry 本地镜像仓库,简单几步结合cpolar内网穿透工具实现…

网络安全之重发布与路由策略详解

重发布&#xff1b;import &#xff08;路由导入&#xff09; 将不同方式&#xff08;直连、静态、缺省、其他协议&#xff09;的路由器重发布进入RIP&#xff0c;OSPF中。 注意&#xff1a;1、华为中不能将缺省路由重发布进入RUO协议&#xff08;思科也是一样&#xff09;。…

Mac下QT开发环境搭建详细教程

QT Qt是一个跨平台的C应用程序框架&#xff0c;用于开发具有图形用户界面&#xff08;GUI&#xff09;的应用程序&#xff0c;同时也可用于开发非GUI程序&#xff0c;比如控制台工具和服务器。Qt是设计成通用、可移植和高效的&#xff0c;它广泛应用于全球的企业和开发者社区中…

青少年 CTF 练习平台:Misc(一)

前言 当然&#xff0c;我可以更详细地介绍一下青少年CTF练习平台。 青少年CTF练习平台是一个专为青少年设计的网络安全竞赛和训练平台。该平台由思而听&#xff08;山东&#xff09;网络科技有限公司与克拉玛依市思而听网络科技有限公司共同建设&#xff0c;自2018年创建以来…