並查集解樹的最近公共祖先問題

2021-07-26 09:41:54 字數 543 閱讀 1194

題意:求樹上亮點的最近公共祖先,就是求包含這兩個點的最小的子樹的根節點。

就是預先儲存所有詢問,然後深搜便利所有點,後序遍歷找到每個詢問中的點,對於每個詢都是在兩個點都找到的那一刻得到最近公共祖先,後序遍歷中不斷把點加入並查集中,已加入的最上面的點就是當前的根節點。

解題**:

#include#includeusing namespace std;

int a[10005];

int find(int x,int y)

if(a[m2]==m2)

break;

m2=a[m2];

}if(flag!=0)

break;

if(a[m1]==m1)

break;

m1=a[m1];

}return flag;

}int main()

{ int t,n,node1,node2,ans;

scanf("%d",&t);

for(int i=0;i

解本題所檢視過的資料:   (並查集詳解)

樹的最近公共祖先

做了一些二叉樹的題,發現二叉樹的查詢問題一般都是從左右子樹遞迴去解決,也往往都能得到答案,因此,這道題可以考慮是否能從左右子樹進行遞迴去解決呢?首先,要想通過遞迴來實現,就需要先確定臨界條件,那麼臨界條件是什麼呢?換句話說,臨界條件就是遞迴中能夠直接返回的特殊情況,第一點則是最常見的 判空 判斷根結...

最近公共祖先問題

最近公共祖先 least common ancestors 問題是面試中經常出現的乙個問題,這種問題變種很多,解法也很多。最近公共祖先問題的定義如下 對於有根樹t的兩個結點u v,最近公共祖先lca t,u,v 表示乙個結點x,滿足x是u v的祖先且x的深度盡可能大。另一種理解方式是把t理解為乙個無...

最近公共祖先問題

在樹中尋找兩個結點的最近公共祖先 從樹的根節點開始進行深度優先搜尋,每次經過某乙個點 無論是從它的父親節點進入這個點,還是從它的兒子節點返回這個點,都按順序記錄下來。這樣就把一棵樹轉換成了乙個陣列。而找到樹上兩個節點的最近公共祖先,無非就是找到這兩個節點最後一次出現在陣列中的位置所囊括的一段區間中深...