如題,給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。
輸入輸出格式
輸入格式:
第一行包含三個正整數n、m、s,分別表示樹的結點個數、詢問的個數和樹根結點的序號。
接下來n-1行每行包含兩個正整數x、y,表示x結點和y結點之間有一條直接連線的邊(資料保證可以構成樹)。
接下來m行每行包含兩個正整數a、b,表示詢問a結點和b結點的最近公共祖先。
輸出包含m行,每行包含乙個正整數,依次為每乙個詢問的結果。
554
3124
5114
2432
3512
45
441
44
說明
時空限制:1000ms,128m
資料規模:
對於30%的資料:n<=10,m<=10
對於70%的資料:n<=10000,m<=10000
對於100%的資料:n<=500000,m<=500000
樣例說明:
該樹結構如下:
第一次詢問:2、4的最近公共祖先,故為4。
第二次詢問:3、2的最近公共祖先,故為4。
第三次詢問:3、5的最近公共祖先,故為1。
第四次詢問:1、2的最近公共祖先,故為4。
第五次詢問:4、5的最近公共祖先,故為4。
故輸出依次為4、4、1、4、4。
#include
#define m(a,b) memset(a,b,sizeof(a))
using
namespace std;
inline
void
read
(int
&x)while
(ch>=
'0'&& ch<=
'9')
if(c==
'-')x=
-x;}
const
int maxn=
500005
;int n,m,s;
int cnt=0;
int head[maxn]
;struct nodeedge[maxn<<1]
;void
add(
int x,
int y)
int depth[maxn]
,sz[maxn]
,son[maxn]
,top[maxn]
,fa[maxn]
;void
dfs_1
(int x)
}void
dfs_2
(int x,
int tv)
}int
main()
dfs_1
(s);
dfs_2
(s,s)
;for
(int i=
1;i<=m;i++
)printf
("%d\n"
,depth[x]
?x:y);}
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 b,表示詢問a結點和b...
P3379 模板 最近公共祖先(LCA)
如題,給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。輸入格式 第一行包含三個正整數n m s,分別表示樹的結點個數 詢問的個數和樹根結點的序號。接下來n 1行每行包含兩個正整數x y,表示x結點和y結點之間有一條直接連線的邊 資料保證可以構成樹 接下來m行每行包含兩個正整數a b,表示詢問...