如題,給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。
第一行包含三個正整數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 行每行包含兩個正整數...