並查集類似靜態鍊錶,使用陣列實現,元素的值就是指標指向,即父結點。
每個集合中選出乙個代表,這個代表就是這棵樹中的根。
每個元素指向其父親,根節點的值指向自己。
並查集樹的表示
並查集的基本操作:
1.void makeset(int s):建立乙個並查集,其中包含s個單元素集合
2.int find(int x):其中x是指要查詢的元素的index,結果返回x所屬集合的代表
這個代表告訴你它在哪個集合
注意在find的時候要進行路徑壓縮,否則查詢效率就是樹的高度
是log級別的而不是常數級了
3.void unionset(int x,int y):合併兩個元素所在的集合,就是將乙個集合的代表指向
另乙個集合的代表
合併有兩種方案,兩種方案都遵循弱肉強食的原則
非按秩合併:
const int maxsize = 500;
int uset[maxsize];
void makeset(int size)
int find(int x)
int find(int x)
return x;
}void unionset(int x, int y) else
}
按秩合併
const int maxsize = 500;
int uset[maxsize];
int rank[maxsize];
void makeset(int size)
}
並查集 並查集
本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...
並查集系列(路徑壓縮)
547.朋友圈 難度中等255 班上有n名學生。其中有些人是朋友,有些則不是。他們的友誼具有是傳遞性。如果已知 a 是 b 的朋友,b 是 c 的朋友,那麼我們可以認為 a 也是 c 的朋友。所謂的朋友圈,是指所有朋友的集合。給定乙個n n的矩陣m,表示班級中學生之間的朋友關係。如果m i j 1,...
演算法歸納系列 並查集
並查集主要用於判斷圖的聯通性以及判環等問題的解決。並查集的定義 父陣列,儲存當前下標對應的父節點編號。find 查詢祖先節點 操作 尋找父節點,在此過程中將並查集樹壓平 union 合併操作 聯通兩個點所在的集合 給你乙個由 1 陸地 和 0 水 組成的的二維網格,請你計算網格中島嶼的數量。島嶼總是...