lca思想:
在求解最近公共祖先為問題上,用到的是tarjan的思想,從根結點開始形成一棵深搜樹,非常好的處理技巧就是在回溯到結點u的時候,u的子樹已經遍歷,這時候才把u結點放入合併集合中,
這樣u結點和所有u的子樹中的結點的最近公共祖先就是u了,u和還未遍歷的所有u的兄弟結點及子樹中的最近公共祖先就是u的父親結點。以此類推。。這樣我們在對樹深度遍歷的時候就很自然的將樹中的結點分成若干的集合,兩個集合中的所屬不同集合的任意一對頂點的公共祖先都是相同的,也就是說這兩個集合的最近公共最先只有乙個。對於每個集合而言可以用並查集來優化,時間複雜度就大大降低了,為o(n + q),n為總結點數,q為詢問結點對數。
LCA的tarjan演算法理解
絕對好文 tarjan演算法的步驟是 當dfs到節點u時 1 在並查集中建立僅有u的集合,設定該集合的祖先為u 1 對u的每個孩子v 1.1 tarjan之 1.2 合併v到父節點u的集合,確保集合的祖先是u 2 設定u為已遍歷 3 處理關於u的查詢,若查詢 u,v 中的v已遍歷過,則lca u,v...
LCA的離線演算法
lca least common ancestor 顧名思義,是指在一棵樹中,距離兩個點最近的兩者的公共節點。也就是說,在兩個點通往根的道路上,肯定會有公共的節點,我們就是要求找到公共的節點中深度盡量深的點。還可以表示成另一種說法,就是如果把樹看成是乙個圖,這找到這兩個點中的最短距離。tarjan作...
LCA的倍增演算法
lca,即樹上兩點之間的公共祖先,求這樣乙個公共祖先有很多種方法 每次將深度大的點往上移動,直至二者相遇 在o 2n 預處理重鏈之後,每次就將深度大的沿重鏈向上,直至二者在一條鏈上 先記錄所有的詢問,對樹進行一次dfs,對於搜尋到的點u,先將點u往下搜,再將點u與父節點所在集合合併,之後對於它的所有...