並查集系列

2021-07-10 01:57:26 字數 1111 閱讀 2237

並查集類似靜態鍊錶,使用陣列實現,元素的值就是指標指向,即父結點。

每個集合中選出乙個代表,這個代表就是這棵樹中的根。

每個元素指向其父親,根節點的值指向自己。

並查集樹的表示

並查集的基本操作:

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 水 組成的的二維網格,請你計算網格中島嶼的數量。島嶼總是...