簡單並查集小結。

2021-06-22 08:56:24 字數 1065 閱讀 6060

小夥伴們最近都在瘋狂的發部落格啊。。。。我也來湊湊熱鬧。。。

先發個簡單的並查集吧。。。

所謂的並查集演算法是一種樹型的資料結構,用於處理一些不相交集合的合併及查詢問題。

如果:給出各個元素之間的聯絡,要求將這些元素分成幾個集合,每個集合中的元素直接或間接有聯絡。在這類問題中主要涉及的是對集合的合併和查詢,因此將這種集合稱為並查集。

主要操作:

1.初始化。

把每個點所在的集合初始化為其自身。時間複雜度為o(n);

2.查詢。

查詢元素所在的集合,即根節點;

3.合併。

將兩個元素所在的集合合併成乙個。合併之前應該先判斷兩個元素是否屬於同乙個集合,這可通過「查詢」操作實現。

並查集可以用陣列模擬,也可以用鍊錶實現,另外還有並查集森林。。。。可惜暫時不會。

使用並查集查詢時,如果查詢次數很多,那麼使用樸素版的查詢方式肯定要超時。比如,有一百萬個元素,每次都從第一百萬個開始找,這樣一次運算就是10^6,如果程式要求查詢個一千萬次,這樣下來就是10^13,肯定要出問題的。這就要用到路徑壓縮了。

好了,話不多說,上**。

#include #include #include const int n=999999999;

int bin[n];

///這是樸素查詢的**,適合資料量不大的情況:

int fin (int x)

///路徑壓縮的遞迴方式 可能會造成溢位棧

int find(int x) //查詢x元素所在的集合,回溯時壓縮路徑

///從x結點搜尋到祖先結點所經過的結點都指向該祖先結點

return bin[x];

}///路徑壓縮 的 非遞迴方式

int find(int x)//查詢

return r; //返回根節點的值

}//合併

void me (int x,int y)

int main ()

for (i=0; i

一篇寫的不錯的部落格  形象有趣  好理解

並查集小結

並查集一類的題目最近也做了許多,相對來說,還是比較容易理解和實現的。最早開始接觸並查集是在學習用kruskal求最小生成樹的時候,後來接觸的題目多了,發現並查集還有好多用途,比如典型的判環,區間問題等等。學習並查集的過程中我發現,並查集的路徑壓縮十分重要,有時候對於題目限定的條件,在路徑壓縮的過程中...

並查集小結

小做了一下並查集相關的題目。就從最基礎的開始吧。首先是並查集的介紹,非常好的一篇博文 其次就是一些習題了。首先是這道題目 poj1308 is it a tree?整道題就是需要你判斷給出乙個有向圖是不是一棵樹。這裡會使用到並查集來判環,算是並查集的基礎應用 也就是判斷元素是不是屬於乙個集合 然後是...

並查集小結

並查集一類的題目最近也做了許多,相對來說,還是比較容易理解和實現的。最早開始接觸並查集是在學習用kruskal求最小生成樹的時候,後來接觸的題目多了,發現並查集還有好多用途,比如典型的判環,區間問題等等。學習並查集的過程中我發現,並查集的路徑壓縮十分重要,有時候對於題目限定的條件,在路徑壓縮的過程中...