並查集是一種樹型的資料結構,用於處理一些不相交集合(disjoint sets)的合併及查詢問題。常常在使用中以森林來表示。讓每個元素構成乙個單元素的集合,也就是按一定順序將屬於同一組的元素所在的集合合併。
1、makeset(s):建立乙個新的並查集,包含s個單元素集合。
2、union(x,y):把x、y存在的集合合併,若x、y屬於同一集合則不合併。
3、find(x):查詢元素x所在的集合,即根節點。
用樹表示集合,每個節點代表集合中的元素,根節點表示集合的代表。
makeset就是建立s個樹:uset[i]表示集合i的父節點,且根節點的父節點就是它本身。
const
int maxsize = 500;
int uset[maxsize];
void makeset(int size)
find就是找元素x所在集合的根節點:
int find(int
x) or
int find(int
x) retur x;
}
其中涉及到乙個路徑壓縮問題,當元素x不是根節點的子元素時,可以令uset[i]=根,縮短後續查詢的路徑。
union就是將y的根節點連到x的根節點上:可以考慮將較矮的樹作為子樹連到另一棵樹上。
void
union(int x, int y)
}
並查集演算法
所謂並查集,它是乙個集合,這個集合的元素也是集合,他支援三種操作 makeset x 建立乙個只有乙個元素x的集合x0,將這個集合放入並查集中 findset x 在並查集中尋找乙個元素s 注意並查集的元素s也是集合 滿足 x屬於s union x,y 將並查集中的元素s1,s2合併,其中x屬於s1...
並查集演算法
includeint pre 10 int find int x 查詢祖先節點 int i x,j while i r 壓縮路徑 return r void join int x,int y int main 2 食物鏈問題 description 動物王國中有三類動物a,b,c,這三類動物的食物鏈...
並查集演算法
並查集是一種資料結構。首先,我們有一群數,1,2 3,4,5 1115 而每個數又有屬於他自己的集合,例如,我們的任務就是判斷某兩個數是否屬於同乙個集合。我們把每個集合都可以看成是一棵樹,不知道什麼是樹的同學可以接著往下看 判斷兩個數是否屬於乙個集合,實際就是判斷他們的根節點是都是同乙個?劃重點,考...