總結 LCA的4種求法

2022-03-29 08:38:01 字數 671 閱讀 4344

lca的求法有多重多樣,總結下來是下面這4種.希望大家可以加油!

我們考慮dfs求出每乙個點的父親(在當前根下),然後直接先暴力跳到同乙個深度,再同時跳

void dfs(int u,int f)

}int lca(int u,int v)

}int lca(int a,int b)

考慮把乙個樹分成輕鏈與重鏈,然後直接跳鏈就好了.

void dfs1(int u,int f)

}void dfs2(int u,int tp)

}void swap(int &a,int &b)

int lca(int u,int v)

考慮把每乙個詢問當做一條邊處理,那麼如果這兩個都被訪問了,顯然另乙個點的祖先一定是他們的lca.

所以可以很容易地寫出這一段**.(注意最後合併)

int find(int x)

void add(int u,int v)

void addques(int u,int v,int id)

void dfs(int u,int fa)

int uu=find(u),vv=find(v);

if(uu!=vv)f[vv]=uu;

} }}

LCA問題的三種求法

先來看一道例題 hdu 2586 how far away 題目描述的就是給你一棵n個節點的樹,然後q次詢問,每次詢問的內容是節點x和節點y的最近公共祖先 lca 接下來就來說一說lca 最近公共祖先 你需要準備的預備知識 st表處理rmq問題 並查集的思想以及實現 dfs遍歷整棵樹,維護一些值 求...

區間第k大(4種求法)

線性區間求第k大是乙個老生常談的問題,我們來總結下4種求解方法 當然遠不止這4種,老話說思想有多遠就能走多遠 這裡我們對每種方法的各種屬性進行乙個簡單評級 1 5,沒有任何倍數關係 1 主席樹 實現難度 2 時間消耗 2 空間消耗 4 2 整體二分 實現難度 4 時間消耗 1 空間消耗 2 3 分塊...

模板 最近公共祖先 LCA 的幾種求法

顧名思義就是兩節點最近的公共祖先 lca常用求法 dfs st表 倍增tarjan 樹鏈剖分 首先預處理一下每個節點的第 2 i 個祖先 我們就可以跳著走避免一次走一步的龜速 引理 對於任意乙個非零整數,我們都可以將他用2的次冪表示出來。這個引理是始終成立的 很顯然 寫程式的時候需要注意乙個地方就是...