詳解並查集

2021-08-11 07:53:09 字數 1445 閱讀 3648

並查集主要用來求解不相交集合的問題,主要針對於合併查詢兩種演算法。

並查集的實現主要包含了三個部分:

並查集的初始化是對單個資料建立了乙個單獨的集合,每個集合應該包含以下兩個資料:

由以上兩個資料,一般的並查集的結構一般有兩種表示形式:

結構體構造如下:

#define max 50;

struct node

node[max];

陣列構造比較方便簡單,因此我們便採用此種方法構造並查集。

合併操作是並查集的關鍵,我採用如下的圖來解釋:

我們開闢乙個擁有十個元素的陣列,裡面所有的資料都存放為-1。

假設關係如下:

因此我們需要根據如上關係確定陣列中的資料內容,我們把資料0作為根結點,裡面存放的是自己的值加上所有子節點內容相加的值,8、9作為子節點,則8、9結點裡面存放的內容是父親結點也就是0號下標(同理,3號結點存放自己結點的值加上5、7結點內容相加的值,5、7結點裡面存放的內容是3號結點的下標),如下如所示。

那麼如果我們的情況變得複雜呢,關係變為如下圖:

那麼此時我們的陣列就要變為如下所示:

查詢並查集是查詢並查集的源頭結點,因此我們可以採用遞迴演算法,如果陣列裡面的內容不是指向父節點,則說明到了源頭結點,此時返回即可,如果是指向父節點,則去父結點找即可。

#include 

using

namespace

std;

class unionset

~unionset()

void merge(int x1,int x2)

}int getroot(int x)

return root;

}private:

int * arr;

size_t size;

};int main()

,,,,, };

unionset set(n);

for (int i = 0; i < m; i++)

return

0;}

並查集詳解

其實並查集顧名思義就是有 合併集合 和 查詢集合 兩種操作的關於資料結構的一種演算法。並查集演算法不支援分割乙個集合。用集合中的某個元素來代表這個集合,該元素稱為集合的代表元。乙個集合內的所有元素組織成以代表元為根的樹形結構。對於每乙個元素 parent x 指向x在樹形結構上的父親節點。如果x是根...

並查集詳解

看大佬的形象解釋 並查集 按我現在對這個的理解 就是給你一堆數,然後給你兩個兩個數的關係,然後關係的傳遞性 連帶性 這些數就都有了關係 有關係的數組成乙個陣列,然後輸出這個一維陣列,裡面有幾個沒關係的陣列 應該怎麼做呢?第一種解釋是 每給兩個數就把乙個數當成祖宗,把另乙個數當成孩子,然後給了孩子和另...

並查集詳解

並查集是一種樹型的高階資料結構,主要用於處理不相交集合的合併及查詢問題。它在電腦科學中有著廣泛的應用,例如求解最小生成樹 親戚關係的判定 確定無向圖的連通子圖個數 最小公共祖先問題等,都要用到並查集。集合是數學中最基本的構造之一,將一組滿足某種性質的物件放在一起就形成了集合。集合中包含的物件稱為集合...