1.將兩個集合合併。
2.詢問兩個元素是否在乙個集合當中。
複雜度近乎o(1)
基本原理:每個集合用一棵樹來表示。樹根的編號就是整個集合的編號。每個節點儲存它的父節點,p[x]表示x的父節點。
問題1:如何判斷樹根: if (p[x] == x)
問題2:如何求x的集合編號:while(p[x] != x) x = p[x];
問題3:如何合併兩個集合:px是x的集合編號,py是y的集合編號。p[x] = y
優化:路徑壓縮:查到祖先之後就把px存成祖先。
1.樸素並查集:
核心**如下:
2.維護size的並查集int p[n]
;//儲存每個點的祖宗節點
int find
(int x)
3.維護到祖宗節點的距離的並查集int p[n]
;//儲存每個點的祖宗節點
int size[n]
;//size只有祖宗節點的有意義,表示祖宗節點所在集合中的點的數量
// 返回x的祖宗節點
int find
(int x)
// 初始化,假定節點編號是1~n
for(int i =
1; i <= n; i++
)// 合併a和b所在的兩個集合:
p[find
(a)]
=find
(b);
size[b]
+= size[a]
;
int p[n]
, d[n]
;//p儲存每個點的祖宗節點, d[x]儲存x到p[x]的距離
int find
(int x)
return p[x];}
// 初始化,假定節點編號是1~n
for(int i =
1; i <= n; i ++
)
資料結構之並查集
並查集 union find sets 是一種簡單的用途廣泛的集合.並查集是若干個不相交集合,能夠實現較快的合併和判斷元素所在集合的操作,應用很多,如其求無向圖的連通分量個數 最小公共祖先 帶限制的作業排序,還有最完美的應用 實現kruskar演算法求最小生成樹。其實,這一部分 演算法導論 講的很精...
資料結構之並查集
覺得很不錯的參考資料引用一下 陣列實現 合併操作代價高,可達o n 2 鍊錶實現 樹結構實現 查詢與合併的平均時間複雜度為o log 2 n 與樹的深度有關,優化 降低時間複雜度 按秩合併 若h b h b,則將b樹作為a樹的子樹。帶路徑壓縮的查詢演算法 改變結點所指方向以減小深度,查詢路徑時 走兩...
資料結構之並查集
並查集是一種用來管理元素分組情況的資料結構。並查集可以高效地進行如下操作。不過需要注意並查集雖然可以進行合併操作,但是卻無法進行分割操作。n個城市中 編號1 n 有一些城市間會有無向的通路。現在小明想從a城市到b城市,判斷是否能實現?即a和b是否有直接或間接的道路連通起來。如有4個城市,其中1和2有...