樹的應用 並查集

2021-10-22 22:19:53 字數 2090 閱讀 8019

首先,什麼是並查集?

並查集是一種簡單的集合表示。

我們可以簡單的思考一下這個名字,「集」應該就是集合的意思,而「並」和「查」,估計是兩種動作或者形容。這個我們後面慢慢就知道了。

乙個結合中有若干個元素,我們通常將該集合劃分成若干個子集。

我們通常用樹的雙親表示法,作為並查集的儲存結構。

我們一般將每個子集,表示成樹的形式。這些樹組成了該並查集的森林。

雙親表示法中,我們用每個孩子結點的指標指向雙親結點,來表示其中的邏輯結構。

通常用陣列元素的下標代表元素名,用根結點的下標代表子集合名,根結點的雙親結點為負數。

我們也會使用該負數的絕對值,來表示該樹中結點的數量。

一些常見的方法: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...