LCA 倍增 學習小結

2021-08-15 15:27:22 字數 1287 閱讀 9140

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 ...