淺談樹鏈剖分

tyccyt發表於2024-08-20

重鏈剖分

用途

  • 路徑上維護
  • 子樹維護
  • 求最近公共祖先(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;
}

相關文章