LCA的各類解法(二) 樹鏈剖分求LCA

2021-08-22 14:45:21 字數 335 閱讀 3907

樹鏈剖分求lca其實就是樹剖的乙個應用.

不會樹剖的點這裡.

樹剖求lca的速度還很快,o(n)預處理,o(log(n))查詢,相較於倍增lca更快,而且求lca那部分更好寫,但是dfs部分比較難寫.

整個演算法流程就是先兩個dfs預處理,然後乙個判斷u與v是否在同一條重鏈,不在就往上跳,最後得到lca.

至於為什麼查詢是o(log(n))的,因為我們可以證明重鏈只有log(n)條,所以是o(n)的.

**如下:

void dfs2(int k,int start)

int lca(int u,int v)

樹鏈剖分求LCA

這裡先推薦兩道練習的裸題 首先是求點 codevs4605 lca 就是求兩個點的公共祖先,每次詢問xor上上乙個詢問的答案。先是兩遍dfs dfs1 把dep siz son求出來 dfs2 求出top和w siz v 表示以v為根的子樹的節點數 dep v 表示v的深度 根深度為1 top v ...

樹鏈剖分求lca

題目描述 給一棵有根樹,以及一些詢問,每次詢問樹上的2 個節點a b,求它們的最近公共祖先.輸入第一行乙個整數n.接下來n 個數,第i 個數fi 表示i 的父親是fi.若fi 0,則i 為樹根.接下來乙個整數m.接下來m 行,每行2 個整數a b,詢問節點 a xor lastans bxor la...

樹鏈剖分(1) 樹剖求LCA

先看乙個樹剖的經典應用 初始化 先dfs一遍子樹,統計出每乙個點x的重兒子son x 和以x為根節點的子樹的大小siz x 這裡選擇x中子樹大小最大的兒子作為它的重兒子,第二遍dfs劃分樹鏈 重兒子與其父親節點劃分到一條鏈。其他的兒子為x的輕兒子,但屬於新的鏈的頂端元素。void dfs1 int ...