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

2021-09-18 08:07:56 字數 1312 閱讀 4692

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

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

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

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

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

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

4041

4243

4445

4647

4849

5051

52

#include

#define init(a,b) memset(a,b,sizeof(a))

#define ll long long

using

namespace

std;

const

int maxn=5e5+7;

const

int maxm=5e5+7;

const

int inf=1

<<32

-1;int begin[maxn],father[maxn][22],depth[maxn],lg[maxn];

struct

edgeae[maxm<<1];

int tot=0,n,m,s;

void

add(int x,int y)

;begin[x]=tot++;

}void

dfs(int now,int fa)

}int

lca(int x,int y)

intmain

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

lg[i]=lg[i-1]+(1

<-1]==i);

dfs(s,0);

while(m--)

return0;}

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

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

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

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

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

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