LCA回顧(主要針對倍增演算法)

2022-05-20 11:33:15 字數 670 閱讀 3355

這個有兩種方法:

就是維護乙個節點的第\(2^0,\ 2^1,\ 2^2\ ...\)層父親,這樣的話我們在後面查詢的時候就可以直接「跳」著找。

void pushup()

然後查詢的時候,先讓兩個點跳到同一深度

所以要讓較深的乙個點先往上跳:

if( dep[x]=0;i--) if( dep[x]-(1<=dep[y] ) x=fa[x][i];
第二行相當於將\(dep(x)-dep(y)\)的值做二進位制拆分

跳到同一深度之後,如果兩個節點已經跳到同乙個位置,就直接退出。

否則,就要繼續同時往上跳,但是,在跳的時候要保證:它們各自跳到的位置必須是不一樣的!不然的話它們可能都跳到了\(lca\)的上面!

整個功能段見下(省略了建圖部分):

struct lca

return; }

int step;

void pushup()

int lca(int x,int y)

}sol;

這個更簡單,用\(top\)陣列直接跳就行了……

LCA倍增演算法

一.倍增演算法的前期鋪墊 我們記節點v到根的深度為depth v 那麼如果節點w是節點u和節點v的最近公共祖先的話,讓u往上走 depth u depth w 步,讓v往上走 depth v depth w 步,都將走到節點w。因此,我們首先讓u和v中較深的乙個往上走 depth u depth v...

lca倍增演算法模板

時間限制 1 sec 記憶體限制 128 mb 提交 244 解決 36 提交 狀態 給一棵樹,節點數為n 1 n 250,000 和q 0 q 100,000 個詢問,對於每個詢問求出所求兩點的最近公共祖先 第一行 節點數n 以下n行,第i 1行 點i的父親節點father i 假定根的父親是0 ...

LCA的倍增演算法

lca,即樹上兩點之間的公共祖先,求這樣乙個公共祖先有很多種方法 每次將深度大的點往上移動,直至二者相遇 在o 2n 預處理重鏈之後,每次就將深度大的沿重鏈向上,直至二者在一條鏈上 先記錄所有的詢問,對樹進行一次dfs,對於搜尋到的點u,先將點u往下搜,再將點u與父節點所在集合合併,之後對於它的所有...