lca問題,即lowest common ancestor 最近公共祖先
lca問題有很多解法,比如
·暴力解法
分塊解法
·倍增演算法
·tarjan演算法
·lct演算法
在這裡呢,我們只討論倍增
倍增演算法其實是一種類似於dp的實現 pa
[i][
j]p a[
i][j
]表示i號節點的2j
2
j個父親 pa
[i][
j]=f
a[i]
(j=0
) pa[
i][j
]=fa
[i](
j=0)
pa[i][j
]=pa
[pa[
i][j
−1]]
[j−1
]](j
>0)
p a[
i][j
]=pa
[pa[
i][j
−1]]
[j−1
]](j
>0)
查詢的時候,我們將它們移至同一層次,再一起向上走即可
下面就直接上一道lca版題**吧
題意:給出一棵樹,和q個詢問,詢問lca是誰
#include
#include
#include
#include
using
namespace
std;
const
int n=100105,m=200005,log=20;
struct nodeedge[m];
int head[n],mcnt;
void add_edge(int u,int v)
int pa[n][log+1];
int deep[n];
int n,q;
void dfs(int u,int d)
}void pre()
int lca(int x,int y)
int main()
dfs(1,1);
pre();
int a,b;
for(int i=1;i<=q;i++)
}
倍增小結 ST 與 LCA
倍增我是真滴不會 倍增法 英語 binary lifting 顧名思義就是翻倍。能夠使線性的處理轉化為對數級的處理,大大地優化時間複雜度。ps 上次學倍增lca,沒學會,老老實實為了嚴格次小生成樹滾回來重新學 st表 n log n 的預處理與 o 1 的查詢 感性理解一下 對於每次詢問 l,r q...
學習筆記 lca 倍增
求一棵樹上兩個節點的最近公共祖先有兩種演算法 tarjan 離線 這篇博文只介紹倍增的寫法.f i j 表示節點 i 的祖先中,與節點 i 距離為 2 j 的節點編號.那麼 f i j beginroot i root father i j 0,i not root f i j f f i j 1 ...
《學習筆記》 倍增 lca
例題 codevs 2370 小機房的樹 簡單來說就是給你乙個n個點的樹,每一條邊都有邊權。詢問有m次,每次給出兩個點,求他們之間的最小邊權和。很容易想到用求樹上字首和和lca,先把兩個點跳到高度相同的地方,再一直往上跳,直到兩個點重合。因為乙個點乙個點的跳太慢了,所以我們倍增的跳來求lca。令f ...