資料結構之並查集

2021-09-25 18:14:03 字數 1175 閱讀 3419

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.樸素並查集

核心**如下:

int p[n]

;//儲存每個點的祖宗節點

int find

(int x)

2.維護size的並查集

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]

;

3.維護到祖宗節點的距離的並查集

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有...