資料結構 並查集

2021-07-04 11:44:35 字數 736 閱讀 4970

並查集,顧名思義,合併 查詢 集合;

並查集是一種樹型的資料結構,用於處理一些不相交集合(disjoint sets)的合併及查詢問題。常常在使用中以森林來表示。

對於概念等等的這裡不再贅述,直接講解應用。

應用1:判斷圖中有多少聯通分量 , 或者圖是否聯通(聯通分量 == 1) hdu 1213

應用2:判斷圖是否成環  給個例題 hdu2120

【初始化】 makeset,將每乙個節點的父節點置為本身;rank(秩),是節點構成樹的深度

void makeset()

}

【查詢】 一直向上查詢,直到找到當前節點的代表,或者說當前節點所在樹的根

ps:路徑壓縮,由於查詢耗時與樹的深度有關,, 所以我們經過一次查詢,都把節點所在樹 壓縮,使之扁平化,這樣樹的深度就大大減小了。

int findroot(int x)  

while(x!=root)  

return root;  

}

【合併】

因為從上面的查詢可以看出,查詢的效率主要影響因素是樹的深度,也就是秩,所以我們在合併兩顆樹的時候,把秩較小的接在 秩較大的樹的根節點上

這樣,樹的秩就不會加深,如果 兩棵樹的秩相等,那麼深度也只會加1;

void union(int x,int y)

}

資料結構 並查集

time limit 1000ms memory limit 65536k 某城市有n個人,現在給定關於n個人的m條資訊,m條資訊是兩個人在同乙個小區,根據所給資訊,判斷這個城市最多可能有多少個小區。n個人編號為1 n。多組輸入。每組第一行有兩個整數n,m 2 n 50000,0 m n 2 接下來...

資料結構 並查集

一 基本概念 並查集是一種樹型的資料結構,用於處理一些不相交集合 disjoint sets 的合併及查詢問題。常常在使用中以森林來表示。集就是讓每個元素構成乙個單元素的集合,也就是按一定順序將屬於同一組的元素所在的集合合併。在一些有n個元素的集合應用問題中,通常是在開始時讓每個元素構成乙個單元素的...

資料結構 並查集

並查集 通過陣列來實現的一種將有關係的節點都聯絡起來的一種搜尋結構。實現 include include using namespace std class unionfindset void union int root1,int root2 結合兩個節點 size t findroot int ...