並查集的啟發式合併

2021-08-09 10:12:34 字數 480 閱讀 8934

在原來剛接觸並查集的時候,感覺確實很方便,也是認為並查集就那麼點東西,簡單方便,但是後來無意間發現了乙個並查集的啟發式合併,可以對並查集進行優化,它優化的理論是用乙個陣列來記錄每個節點的深度,每一次合併都把節點向深度(高度)大的節點上進行合併,從而對最後的「生成樹」深度進行了優化。受益匪淺,好長時間沒寫過部落格了。。。emmm。。。

下面附帶乙個遞迴壓縮路徑找父節點的函式(其實很簡單的那個)

rank 陣列並沒有給出,自己建立乙個清零即可使用

int getf(int v) //查詢他的父節點

}//下面為啟發式合併的核心**,增加乙個rank陣列來儲存每個節點的深度,總是把節點並在深度大的節點上

//這樣做的好處是在後來查詢時可以節省很多時間

void merge(int u, int v)

else if(rank t1 < rank[t2])

else

}}

並查集 啟發式合併,路徑壓縮

一直沒想過自己寫的並查集的複雜度 看那一行 還挺竊喜 貼一下正版的啟發式合併,這樣複雜度就真正到了反阿克曼函式那什麼balabala 乙個優化是 把小的樹合併到大樹中,這樣會讓深度不太大。這個優化稱為啟發式合併。乙個優化是把沿途上所有結點的父親改成根。這一步是順便的,不增加時間複雜度,卻使得今後的操...

啟發式合併

啟發式合併 暴力合併 將兩個資料結構合併,只需要將小的資料結構中的元素乙個乙個的插入大的資料結構o n o n o n 如果題目只有插入操作沒有 總o n logn o nlogn o nlog n 因為每次合併,所有資料結構總大小為n,設兩個資料結構大小為a,b a b a,b a b a,b a...

啟發式合併

includeconst int n 5e5 5 int f n d n r n p n int find int i int unionn int i,int j int main 並查集 按秩啟發式合併 bzoj4668 冷戰 題目大意 給出n個軍工廠和m 個操作,操作分為兩類 0 u v,這次...