最近公共祖先 LCA 模板

2021-09-18 06:56:50 字數 1063 閱讀 3047

lca即最近公共祖先,是指 :在有根樹中,找出某兩個結點u和v最近的公共祖先。

時間複雜度o(nlogn+m+n)

步驟:1.將樹看作乙個無向圖,從根節點開始深搜,得到乙個遍歷序列。 

2.在x~y區間中利用rmq演算法找到深度最小返回其下標。

可以上洛谷找模板題測試:

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int inf=0x3f3f3f3f;

const int n=500010;

struct node

q[n*2];

int f[n],vis[n],deep[n*2],pos[n*2];

int dp[n*2][21];

int cut,n,e;

void add(int a,int b)

void dfs(int x,int s,int pre)

return;

}void rmq()

q[n*2];

int deep[n],par[n][20],f[n],vis[n];

int cut,e;

void add(int a,int b)

void dfs(int x,int pre,int s)

}void prepare(int n)

if(a==b) return a;

for(int i=k;i>=0;i--)

}return par[a][0];

}int main()

dfs(x,0,0);

prepare(n);

for(int i=1;i<=m;i++)

return 0;

}

模板 最近公共祖先(LCA)

題自洛谷 如題,給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。輸入格式 第一行包含三個正整數n m s,分別表示樹的結點個數 詢問的個數和樹根結點的序號。接下來n 1行每行包含兩個正整數x y,表示x結點和y結點之間有一條直接連線的邊 資料保證可以構成樹 接下來m行每行包含兩個正整數a b...

模板 lca 最近公共祖先

lca hljs cpp include include using namespace std const int maxn 500001 int n,m,gen,x,y struct edgeedge 2 maxn int deep maxn fa maxn 20 deep記錄每個點的深度,fa...

最近公共祖先模板(LCA)

我們用鏈式前向星存樹。int head n 1 nex n 1 to n 1 tot 0 void add int a,int b 如果我們用fa x i 表示x的第i級祖先,那麼對時間 空間的複雜度都要求很高,資料稍微大一點顯然不行。所以我們用fa x i 表示x的第1 我們首先dfs去把整棵樹都...