並查集初步

2022-05-27 15:15:15 字數 696 閱讀 7874

並查集可以動態維護若干個不重疊的集合,支援查詢和合併兩個操作,在實際應用中比較廣泛。

並查集的主要功能是查詢元素的集合歸屬,同時支援集合的合併操作。

並查集的實現方法:對於每個集合,選擇乙個元素作為其代表元素,而若兩個元素所在集合的代表元素相同,則說明它們在同乙個集合中。

具體如何實現呢?有一種思路,可以定義乙個陣列來儲存每個數所在集合的代表元素,然而這種方法雖然在查詢時很高效,但在合併時卻要耗費大量的時間。

因此我們可以有另一種方法:將整個並查集看作乙個森林,定義乙個陣列 fa[i]儲存 i的父節點,初始化 fa[i]=i,則查詢乙個元素的代表元素時,可以沿著其父親節點不斷向上找到根節點,從而實現查詢。而合併時,合併兩個集合的根即可,即令 fa[root1]=roo2。

在以上的基礎上,我們還可以進行進一步地優化。我們發現,第一種思路查詢時非常高效,因此我們可以將兩種思路進行結合,在遞迴查詢代表元素時,將路徑上每個元素 x的 fa值直接指向樹根,可以節省很多的時間。這個優化方法被稱為「路徑壓縮」。

還有一種被稱為「按秩合併」的優化方法,讀者可以自行了解。不過一般的實現中用路徑壓縮就足夠了。

查詢代表元素**:(採用路徑壓縮優化)

int get(int a)

合併集合**:

void merge(int x,int y)

習題:

並查集初步

對資料進行合併,查詢某個資料的祖先,建立資料間的聯絡。int fathe mx 根節點 int rank x 樹的高度 void ini intfind int x intunite int x,int y 1 wireless network 題意 有n臺電腦,電腦的覆蓋範圍為k公尺,在覆蓋範圍內...

並查集初步

有若干節點,並將其中一些節點對進行連線,要判斷任意兩個節點是否連通 有路徑到達,而不要求直接連線 連通後就不會斷開連通關係,此時就可以使用並查集。並查集擅長動態維護許多具有傳遞性的關係,能在無向圖中維護節點之間的連通性。要判斷兩個節點是否連通,可以把連通的節點加入到各自的集合裡,也就是,同乙個集合裡...

並查集的初步學習

一 並查集是什麼 並查集是對一堆具有相互關聯的資料中快速找出兩個物件是否具有關聯關係的資料集合,這個問題看似簡單實際上牽扯到大量的計算。二 並查集的解決思路 a 先初始化乙個陣列,然後再讓這個陣列的內容指向本身。b 若這個陣列某個下標與某個下標具有關聯性,那麼就講某個下標的內容指向另乙個下標。解決這...