並查集基礎

2021-10-03 00:19:16 字數 662 閱讀 8821

並查集(disjoint-set)是一種可以動態維護若干個不重疊的集合,並支援合併與查詢的資料結構。

1.get,查詢乙個元素屬於哪個集合

2.merge ,把兩個集合合併成乙個集合

並查集的儲存

使用乙個陣列fa儲存父節點(初始根的父節點設為自己,一開始每個節點自成乙個集合。

int fa[size]

;for

(int i=

1;i<=n;i++

) fa[i]

=i;

並查集的get操作

int

get(

int x)

我們可以每次執行get操作的同時,把訪問過的節點都直接指向根,這種優化方法稱為路徑壓縮。採用路徑壓縮的並查集,每次get操作均攤複雜度為o(logn)。如下圖

並查集的merge操作

合併元素x和元素y所在的集合,等價於讓x的根作為y樹根的子節點

void

merge

(int x,

int y)

並查集基礎

並查集問題描述 在一些有n個元素的集合應用問題中,我們通常是在開始時讓每個元素構成乙個單元素的集合,然後按一定順序將屬於同一組的元素所在的集合合併,其間要反覆查詢乙個元素在哪個集合中。這一類問題近幾年來反覆出現在資訊學的國際國內賽題中,其特點是看似並不複雜,但資料量極大,若用正常的資料結構來描述的話...

並查集基礎

並查集的原理 實現與應用 什麼是並查集 如果給出各個元素之間的聯絡,要求將這些元素分成幾個集合,每個集合中的元素直接或間接有聯絡。在這類問題中主要涉及的是對集合的合併和查詢,因此將這種集合稱為並查集。什麼是等價類 在並查集中,同乙個集合中的元素直接或者間接地有聯絡,我們就把這些元素稱為屬於同乙個等價...

並查集 並查集

本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...