重鏈剖分
用途
- 路徑上維護
- 子樹維護
- 求最近公共祖先(LCA)
- 重剖的性質:
- 樹上每個節點都屬於且僅屬於一條重鏈。
- 在剖分時 重邊優先遍歷,最後樹的 DFS 序上,重鏈內的 DFS 序是連續的。按 DFN 排序後的序列即為剖分後的鏈。
求最近公共祖先
不斷向上跳重鏈,當跳到同一條重鏈上時,深度較小的結點即為 LCA。
向上跳重鏈時需要先跳所在重鏈頂端深度較大的那個。
int lca(int u,int v)
{
while (top[u] != top[v])
{
if (dep[top[u]] > dep[top[v]]) u = fa[top[u]];
else v = fa[top[v]];
}
return dep[u] > dep[v] ? v : u;
}