洛谷 P3379 最近公共祖先(LCA) 模板

2021-09-26 15:07:14 字數 1250 閱讀 3569

如題,給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。

第一行包含三個正整數n、m、s,分別表示樹的結點個數、詢問的個數和樹根結點的序號。

接下來n-1行每行包含兩個正整數x、y,表示x結點和y結點之間有一條直接連線的邊(資料保證可以構成樹)。

接下來m行每行包含兩個正整數a、b,表示詢問a結點和b結點的最近公共祖先。

輸出包含m行,每行包含乙個正整數,依次為每乙個詢問的結果。

5 5 4

3 12 4

5 11 4

2 43 2

3 51 2

4 5

441

44

#include

#include

using namespace std;

typedef

long

long ll;

const

int n=

5e5+20;

//lca

//dep[i]為點i的深度,f[i][j]表示點i的第2^j個祖先

int f[n][20

],dep[n]

;bool vis[n]

;//鄰接表

int cs,head[n]

;struct nodeside[n<<1]

;void

add(

int x,

int y)

//預處理dep陣列和f陣列

void

dfs(

int fa,

int x)

intlca

(int x,

int y)

if(x==y)

return x;

//同一深度找lca的兒子結點

for(

int i=

19;i>=

0;i--)if

(f[x]

[i]!=f[y]

[i])

//不相等則縮小

x=f[x]

[i],y=f[y]

[i];

//當前x或y的父結點即為lca

return f[x][0

];}int

main()

dfs(

0,s)

;for

(int i=

0;i)return0;

}

洛谷P3379 模板 最近公共祖先(LCA)

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

洛谷 P3379 模板 最近公共祖先(LCA)

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

洛谷 P3379 模板 最近公共祖先(LCA)

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