注意!本篇題解不適合初學lca的同學學習,因為我講的很爛很不清楚。
倍增,顧名思義,就是成倍增加的意思。
我們知道,任何乙個數字都可以表示成二進位制。那麼對於一條長度為n的鏈,我們總是可以跳大概logn次到達最後。
對於鏈上任意一點,我們都可以在大概logn的複雜度下詢問到,其實倍增的思路就是二分,和快速冪一模一樣。
那麼怎麼用倍增求lca呢?
首先在樹上求每個節點的深度,並且更新每個節點的祖先節點。假如有a和b兩個結點,我們就假設深度大的為a,我們可以在logn的複雜度下跳到b的深度,然後a和b同時在logn的複雜度下跳到lca。
所以倍增求lca的複雜度是logn的啦。
下面上**吧:(這是乙份常數極大的模板,慎用。)
#include using namespace std;
const int maxn = 5e5+7;
const int maxl = 21;
int fa[maxn][maxl];
int depth[maxn];
int lg[maxn];
vectorg[maxn];
void dfs(int now,int last)
} return fa[x][0];
}int main()
for(int i=1;i<=n;i++)
dfs(s,0);
for(int i=0;ireturn 0;
}
LCA倍增法模板
deg其實應該寫成depth吧,存的是每個結點的深度,dfs的過程是為了處理出每個結點的深度,用遞推式計算出fa u i 其中f u i 表示u的第2 i個祖先 基本思想是 d i 表示 i節點的深度,p i,j 表示 i 的 2 j 倍祖先 那麼就有乙個遞推式子 p i,j p p i,j 1 j...
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,最近公共祖先,是指一棵樹上兩個節點的深度最大的公共祖先。也可以理解為兩個節點之間的路徑上深度最小的點。我們這裡用了倍增的方法求了lca。我們的基本的思路就是,用dfs遍歷求出所有點的深度。f i j 陣列用來求的是距離節點i,距離2 j的祖先。可以知道,f i 0 就是它的直接父親。然...