【董曉算法】競賽常用知識之圖論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.pswp.cn/diannao/14464.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/14464.shtml
英文地址,請注明出處:http://en.pswp.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年創建以來…