樹 並查集 實現和應用

2022-07-02 03:57:08 字數 1037 閱讀 1538

目錄並查集是一種維護集合的資料結構,並: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)

}

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

// 遞迴

int find(int x)

return x;

}// 非遞迴

int find(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 的父親節點,而父親節點本身也是這個集合內的元素。如果fath...

樹的應用 森林 並查集

並查集屬於不相交的資料結構,可以用乙個根節點代表整棵樹來進行判斷,並查集的核心簡化步驟有乙個就是在構建樹的時候應用了路徑壓縮 以便之後查詢的時候速度更加快捷 以下貼出例題原始碼,並在原始碼中講解並查集的四個模板函式 include iostream include cstdio using name...