總的來說是深度遍歷。以根為節點建立並查集。比如說求p,v的lca。當訪問到p的時候檢查v是否已經訪問過。如果訪問過,那麼他們的lca就是v現在所在的並查集裡面的元素。如果沒有訪問到。那麼等到v訪問到的時候可以操作一下。
充分利用了遞迴這個操作,所以不必要儲存以前的東西,自然而然的就將u裡面的所有的子節點子孫節點都和並到一塊去了。
這個想了比較長的時間。
這個是偽**
lca(u)
checked[u]=true
對於每個(u,v)屬於p
方法二:
在配合用動態規劃。用乙個陣列來儲存,這樣的話就更好了。
LCA離線演算法tarjan
lca演算法 lca least common ancestor 是指在一棵樹中,距離兩個點最近的兩者的公共節點。也就是說,在兩個點通往根的道路上,肯定會有公共的節點,我們就是要求找到公共的節點中,深度盡量深的點。還可以表示成另一種說法,就是如果把樹看成是乙個圖,這找到這兩個點中的最短距離。本文先介...
LCA 離線tarjan演算法
對於最近公共祖先問題,我們先來看這樣乙個性質,當兩個節點 u,v 的最近公共祖先是x時,那麼我們可以確定的說,當進行後序遍歷的時候,必然先訪問完x的所有子樹,然後才會返回到x所在的節點。這個性質就是我們使用tarjan演算法解決最近公共祖先問題的核心思想。同時我們會想這個怎麼能夠保證是最近的公共祖先...
關於LCA的離線演算法 Tarjan
利用並查集優越的時空複雜度,我們可以實現lca問題的o n q 演算法,這裡q表示詢問 的次數。tarjan演算法基於深度優先搜尋的框架,對於新搜尋到的乙個結點,首先建立由這個結點 構成的集合,再對當前結點的每乙個子樹進行搜尋,每搜尋完一棵子樹,則可確定子樹 內的lca詢問都已解決。其他的lca詢問...