關於LCA的離線演算法 Tarjan

2021-06-05 09:11:58 字數 702 閱讀 4130

利用並查集優越的時空複雜度,我們可以實現lca問題的o(n+q)演算法,這裡q表示詢問

的次數。

tarjan演算法基於深度優先搜尋的框架,對於新搜尋到的乙個結點,首先建立由這個結點

構成的集合,再對當前結點的每乙個子樹進行搜尋,每搜尋完一棵子樹,則可確定子樹

內的lca詢問都已解決。其他的lca詢問的結果必然在這個子樹之外,這時把子樹所形

一棵子樹,直到當前結點的所有子樹搜尋完。這時把當前結點也設為已被檢查過的,同

時可以處理有關當前結點的lca詢問,如果有乙個從當前結點到結點v的詢問,且v已被

檢查過,則由於進行的是深度優先搜尋,當前結點與v的最近公共祖先一定還沒有被檢

查,而這個最近公共祖先的包涵v的子樹一定已經搜尋過了,那麼這個最近公共祖先一定

是v所在集合的祖先。

下面給出這個演算法的偽**描述:

以下內容為程式**:

lca(u)

checked[u]=true

對於每個(u,v)屬於p

} }

由於是基於深度優先搜尋的演算法,只要呼叫lca(root[t])就可以回答所有的提問了,這

裡root[t]表示樹t的根,假設所有詢問(u,v)構成集合p。make-set,find-set,union是

對於並查集的操作。

LCA的離線演算法

lca least common ancestor 顧名思義,是指在一棵樹中,距離兩個點最近的兩者的公共節點。也就是說,在兩個點通往根的道路上,肯定會有公共的節點,我們就是要求找到公共的節點中深度盡量深的點。還可以表示成另一種說法,就是如果把樹看成是乙個圖,這找到這兩個點中的最短距離。tarjan作...

LCA離線演算法tarjan

lca演算法 lca least common ancestor 是指在一棵樹中,距離兩個點最近的兩者的公共節點。也就是說,在兩個點通往根的道路上,肯定會有公共的節點,我們就是要求找到公共的節點中,深度盡量深的點。還可以表示成另一種說法,就是如果把樹看成是乙個圖,這找到這兩個點中的最短距離。本文先介...

LCA 離線tarjan演算法

對於最近公共祖先問題,我們先來看這樣乙個性質,當兩個節點 u,v 的最近公共祖先是x時,那麼我們可以確定的說,當進行後序遍歷的時候,必然先訪問完x的所有子樹,然後才會返回到x所在的節點。這個性質就是我們使用tarjan演算法解決最近公共祖先問題的核心思想。同時我們會想這個怎麼能夠保證是最近的公共祖先...