題目描述
如題,給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。
輸入輸出格式
輸入格式:
第一行包含三個正整數n、m、s,分別表示樹的結點個數、詢問的個數和樹根結點的序號。
接下來n-1行每行包含兩個正整數x、y,表示x結點和y結點之間有一條直接連線的邊(資料保證可以構成樹)。
接下來m行每行包含兩個正整數a、b,表示詢問a結點和b結點的最近公共祖先。
輸出格式:
輸出包含m行,每行包含乙個正整數,依次為每乙個詢問的結果。
分析:lca模板,不過dfs的時候要找到每個節點的父親。
**
#include
#include
using
namespace
std;
#define maxn 1000005
struct edge
a[maxn];
int dep[maxn / 2],f[maxn / 2][30],ls[maxn];
bool v[maxn];
int n,m,ans,e;
void add(int p,int q)
void dfs(int d,int i,int fa)
}int lca(int p,int q)
return f[p][0];
} int main()
v[root] = 1;
dfs(1,root,0);
for (int j=1;j<=20;j++)
for (int i=1;i<=n;i++)
f[i][j]=f[f[i][j-1]][j-1];
for (int i=1;i<=m;i++)
}
洛谷 P3379 模板 最近公共祖先(LCA)
如題,給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。輸入格式 第一行包含三個正整數n m s,分別表示樹的結點個數 詢問的個數和樹根結點的序號。接下來n 1行每行包含兩個正整數x y,表示x結點和y結點之間有一條直接連線的邊 資料保證可以構成樹 接下來m行每行包含兩個正整數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,yx,y,表示 x 結點和 y 結點之間有一條直接連線的邊 資料保證可以構成樹 接下來 m 行每行包含兩個正整數...