首先,什麼是並查集?
並查集是一種簡單的集合表示。
我們可以簡單的思考一下這個名字,「集」應該就是集合的意思,而「並」和「查」,估計是兩種動作或者形容。這個我們後面慢慢就知道了。
乙個結合中有若干個元素,我們通常將該集合劃分成若干個子集。
我們通常用樹的雙親表示法,作為並查集的儲存結構。
我們一般將每個子集,表示成樹的形式。這些樹組成了該並查集的森林。
雙親表示法中,我們用每個孩子結點的指標指向雙親結點,來表示其中的邏輯結構。
通常用陣列元素的下標代表元素名,用根結點的下標代表子集合名,根結點的雙親結點為負數。
我們也會使用該負數的絕對值,來表示該樹中結點的數量。一些常見的方法:
initial(s)
:將集合s中的每個元素都初始化為只有乙個單元素的子集合。
就是將有n個元素的集合,初始化為n個單元素的子集合。
union(s, root1, root2)
:把集合s中的子集合(互不相交)root2併入子集合root1。
這就是所謂的「並」的操作。這裡要注意的是兩個集合是不想交的,如果它們有相交的部分,就不予執行。
find(s, x)
:查詢集合s中單元素x所在的子集合,並返回該子集合的名字。
這就是所謂的「查」的操作。舉例:我們有乙個集合,s:返回的就是根結點的標號。
s =
首先進行初始化操作,initial(s)
:
得到:
s0 = ,
s1 = ,
s2 = ,
s3 = ,
s4 = ,
s5 = ,
s6 = ,
s7 = ,
s8 = ,
s9 =
我們用樹來表示的話,就是十個結點:
而它們的儲存,就是這樣的:
如果它們變成了三個子集合:
s0 = ,
s1 = ,
s2 =
這個時候,樹的結構就會變為:
而儲存結構為:
語言實現:
#define size 100
int ufsets[size]
;void
initial
(int s)
}void
find
(int s,
int x)
return x;
}void
union
(int s,
int root1,
int root2)
樹的應用 森林 並查集
並查集屬於不相交的資料結構,可以用乙個根節點代表整棵樹來進行判斷,並查集的核心簡化步驟有乙個就是在構建樹的時候應用了路徑壓縮 以便之後查詢的時候速度更加快捷 以下貼出例題原始碼,並在原始碼中講解並查集的四個模板函式 include iostream include cstdio using name...
樹 並查集 實現和應用
目錄並查集是一種維護集合的資料結構,並 union,查 find,集 set。並查集支援下面兩種操作 合併 合併兩個集合 查詢 判斷兩個元素是否在乙個集合 並查集使用乙個陣列實現 int father n 其中 father i 代表元素 i 的父親節點,而父親節點本身也是這個集合內的元素。如果fa...
並查集的應用
特點 1,都有乙個陣列儲存它的根節點 2,用vis陣列儲存其是否訪問過 3,如果cnt 1 說明該圖是連通的。連通圖中只有根節點的父節點是自身,cnt應該是1 解決的題目 1,題目已經給了圖上頂點之間的關係,通過頂點之間的關係,求連通分量的個數 include stdio.h int bin 100...