樹 並查集的原理和實現

2021-10-04 07:17:29 字數 1122 閱讀 8403

並查集是一種維護集合的資料結構,並:union,查:find,集:set

並查集支援下面兩種操作:

合併:合併兩個集合

查詢:判斷兩個元素是否在乙個集合

並查集使用乙個陣列實現

int father[n]

;

其中 father[i] 代表元素 i 的父親節點,而父親節點本身也是這個集合內的元素。

如果father[i] == i說明元素 i 是該集合的根結點,但是對於同乙個結合來說只存在乙個根結點,且將其作為所屬集合的標識

乙個實現

初始化father陣列,但我們通常還會初始化另外乙個輔助的資料結構height[n], 來記錄每個結點的深度,以使得我們的並查集的效率不會太差,不會生成乙個非常長高的單鏈。

#define n 1001

int father[n]

;//記錄父節點

int height[n]

;//記錄每個節點的高度

void

initial

(int n)

}

由於同乙個集合只存在乙個根結點,所以查詢操作就是對給定的結點尋找其根結點的過程。

// 遞迴

intfind

(int x)

return x;

}// 非遞迴

intfind

(int x)

return x;

}

把兩個集合合併成乙個,思路:

首先判斷兩個元素是否是同乙個集合,就是看二者是否有相同的根結點

如果不是同乙個集合,那麼把乙個集合的根結點的父親指向另乙個集合的根結點

void

union

(int x,

int y)

else

if(height[x]

> height[y]

)else

}}

樹 並查集 實現和應用

目錄並查集是一種維護集合的資料結構,並 union,查 find,集 set。並查集支援下面兩種操作 合併 合併兩個集合 查詢 判斷兩個元素是否在乙個集合 並查集使用乙個陣列實現 int father n 其中 father i 代表元素 i 的父親節點,而父親節點本身也是這個集合內的元素。如果fa...

並查集的實現

給定乙個沒有重複值的整形陣列arr,初始時認為arr中每乙個數各自都是乙個單獨的集合。請設計一種叫unionfind的結構,並提供以下兩個操作。boolean issameset int a,int b 查詢a和b這兩個數是否屬於乙個集合 void union int a,int b 把a所在的集合...

並查集和帶權並查集

並查集是乙個很高效演算法,理解起來也很簡單,寫起來更簡單。fat i i 找到乙個點的祖先 int findfat int x 二中的方法肯定不好,因為如果資料比較極端,那麼並查集就退化成乙個鏈了 如果加入了路徑壓縮,並查集這個演算法就更高效了。int findfat int x 遞迴寫法 int ...