並查集的特點:
1.可以高效查詢元素 a 和元素b是否屬於同一組
2.合併元素a和元素b所在的組 (無法分割)
初始化:n個節點來表示元素,最開始沒有邊。
合併:從乙個組的跟向另乙個組連邊,這樣兩棵樹就變成了一棵樹,也就把兩個組合並為乙個組了。
查詢:為了查詢兩個節點是否屬於同乙個組,我們需要沿著樹往上走,來查詢包含這個元素的根上誰,如果是同乙個根,則屬於同乙個組。
避免退化:對於每棵樹,記錄這棵樹的高度(rank),合併時如果兩棵樹的rank不同,那麼從rank小的向rank大的連邊。
路徑壓縮:對於每乙個節點,一旦向上走到了一次根節點,就把這個點到父親的邊改為直接連上根。
模板實現:
1int par[maxn]; //父親2
int rank[maxn]; //
樹的高度3//
初始化n個元素
4void init(int
n) 9}10
//查詢樹的根
11int find(int
x) 15
else
return par[x]=find(par[x]);16}
17//
合併x和y所屬集合
18void unite(int x,int
y) else29}
30//
判斷x 和y是否屬於同乙個 集合
31bool same(int x,int
y)
php 簡單並查集實現
n 10 10個結點 case 7 7組關係,如下 data array array 2,4 array 7,5 array 1,3 array 8,9 array 1,2 array 5,6 array 2,3 ufstree array function make set ufstree,n f...
簡單並查集
哈爾濱理工大學oj 1160 吸血鬼 description remilia是 東方紅魔館 中首次亮相的吸血鬼角色,是有著500歲年齡的吸血鬼領主。作為紅魔館的主人,有著高貴和威嚴的氣質,不過也經常任性和孩子氣。關於吸血鬼有很多傳說。吸血鬼是乙個血族,有著嚴格的等級。吸血鬼會嚴格聽從血之主人的命令。...
並查集的實現
給定乙個沒有重複值的整形陣列arr,初始時認為arr中每乙個數各自都是乙個單獨的集合。請設計一種叫unionfind的結構,並提供以下兩個操作。boolean issameset int a,int b 查詢a和b這兩個數是否屬於乙個集合 void union int a,int b 把a所在的集合...