小夥伴們最近都在瘋狂的發部落格啊。。。。我也來湊湊熱鬧。。。
先發個簡單的並查集吧。。。
所謂的並查集演算法是一種樹型的資料結構,用於處理一些不相交集合的合併及查詢問題。
如果:給出各個元素之間的聯絡,要求將這些元素分成幾個集合,每個集合中的元素直接或間接有聯絡。在這類問題中主要涉及的是對集合的合併和查詢,因此將這種集合稱為並查集。
主要操作:
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求最小生成樹的時候,後來接觸的題目多了,發現並查集還有好多用途,比如典型的判環,區間問題等等。學習並查集的過程中我發現,並查集的路徑壓縮十分重要,有時候對於題目限定的條件,在路徑壓縮的過程中...