我們用鏈式前向星存樹。
int head[n<<1]
,nex[n<<1]
,to[n<<1]
,tot=0;
void
add(
int a,
int b)
如果我們用fa[x][i]表示x的第i級祖先,那麼對時間、空間的複雜度都要求很高,資料稍微大一點顯然不行。
所以我們用fa[x][i]表示x的第1《我們首先dfs去把整棵樹都預處理一下。
void
dfs(
int x,
int y)
for(
int i=head[x]
;i;i=nex[i]
)}
然後在找lca的時候,我們預處理一下log2(i)
for
(int i=
2;i<=n;i++
) lg[i]
=lg[i>>1]
+1;
lca實現
int
lca(
int x,
int y)
}return fa[x][0
];}
最後總**
#include
using
namespace std;
const
int n=
5e5+5;
const
double eps=
1e-6
;const
int inf=
0x7fffffff
;typedef
long
long ll;
#define fi first
#define se second
#define pii pair
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//#define int long long
#define endl '\n'
int n,m,s,fa[n][30
],deep[n]
,lg[n]
;int head[n<<1]
,nex[n<<1]
,to[n<<1]
,tot=0;
void
add(
int a,
int b)
void
dfs(
int x,
int y)
for(
int i=head[x]
;i;i=nex[i])}
intlca
(int x,
int y)
}return fa[x][0
];}signed
main()
dfs(s,0)
;for
(int i=
2;i<=n;i++
) lg[i]
=lg[i>>1]
+1;while
(m--
)}
模板 最近公共祖先(LCA)
題自洛谷 如題,給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。輸入格式 第一行包含三個正整數n m s,分別表示樹的結點個數 詢問的個數和樹根結點的序號。接下來n 1行每行包含兩個正整數x y,表示x結點和y結點之間有一條直接連線的邊 資料保證可以構成樹 接下來m行每行包含兩個正整數a b...
模板 lca 最近公共祖先
lca hljs cpp include include using namespace std const int maxn 500001 int n,m,gen,x,y struct edgeedge 2 maxn int deep maxn fa maxn 20 deep記錄每個點的深度,fa...
最近公共祖先 LCA 模板
lca即最近公共祖先,是指 在有根樹中,找出某兩個結點u和v最近的公共祖先。時間複雜度o nlogn m n 步驟 1.將樹看作乙個無向圖,從根節點開始深搜,得到乙個遍歷序列。2.在x y區間中利用rmq演算法找到深度最小返回其下標。可以上洛谷找模板題測試 include include inclu...