最近公共祖先模板(LCA)

2021-10-03 15:46:50 字數 1649 閱讀 7627

我們用鏈式前向星存樹。

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去把整棵樹都預處理一下。

void

dfs(

int x,

int y)

for(

int i=head[x]

;i;i=nex[i]

)}

然後在找lca的時候,我們預處理一下log2(i)

for

(int i=

2;i<=n;i++

) lg[i]

=lg[i>>1]

+1;

lca實現

int

lca(

int x,

int y)

}return fa[x][0

];}

最後總**

#include

using

namespace std;

const

int n=

5e5+5;

const

double eps=

1e-6

;const

int inf=

0x7fffffff

;typedef

long

long ll;

#define fi first

#define se second

#define pii pair

#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

//#define int long long

#define endl '\n'

int n,m,s,fa[n][30

],deep[n]

,lg[n]

;int head[n<<1]

,nex[n<<1]

,to[n<<1]

,tot=0;

void

add(

int a,

int b)

void

dfs(

int x,

int y)

for(

int i=head[x]

;i;i=nex[i])}

intlca

(int x,

int y)

}return fa[x][0

];}signed

main()

dfs(s,0)

;for

(int i=

2;i<=n;i++

) lg[i]

=lg[i>>1]

+1;while

(m--

)}

模板 最近公共祖先(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 模板

lca即最近公共祖先,是指 在有根樹中,找出某兩個結點u和v最近的公共祖先。時間複雜度o nlogn m n 步驟 1.將樹看作乙個無向圖,從根節點開始深搜,得到乙個遍歷序列。2.在x y區間中利用rmq演算法找到深度最小返回其下標。可以上洛谷找模板題測試 include include inclu...