並查集,最基礎的

2021-06-20 16:13:09 字數 1636 閱讀 1658

什麼是並查集?

並查集是一種樹型的資料結構,用於處理一些不相交集合(disjoint sets)的合併及查詢問題。常常在使用中以森林來表示。集就是讓每個元素構成乙個單元素的集合,並就是按一定順序將屬於同一組的元素所在的集合合併。

並查集的主要操作:

1、初始化:把每個點所在集合初始化為其自身;

2、查詢:查詢元素所在的集合即根節點;

3、合併:將兩個元素所在的集合合併為乙個集合,合併兩個不相交集合判斷兩個元素是否屬於同一集合。

(1)初始化:

for(int i=0;ifather[i]=i;

因為每個元素屬於單獨的乙個集合,所以每個元素以自己作為根結點。

(2)尋找根結點編號:

int find(int x)

(3)合併兩個集合:

void merge(int a,int b)

(4)判斷元素是否屬於同一集合:

function judge(x, y : integer) : boolean;

begin

x:=getfaher(x);

y:=getfather(y);

if x=y then exit(true)

else exit(false);

end;

下面看乙個最基礎的例子、

例題1、親戚

【問題描述】

若某個家族人員過於龐大,要判斷兩個是否是親戚,確實還很不容易,現在給出某個親戚關係圖,求任意給出的兩個人是否具有親戚關係。

規定:x和y是親戚,y和z是親戚,那麼x和z也是親戚。如果x,y是親戚,那麼x的親戚都是y的親戚,y的親戚也都是x的親戚。

【輸入】

第一行:三個整數n,m,p,(n<=5000,m<=5000,p<=5000),分別表示有n個人,m個親戚關係,詢問p對親戚關係。

以下m行:每行兩個數mi,mj,1<=mi,mj<=n,表示ai和bi具有親戚關係。

接下來p行:每行兩個數pi,pj,詢問pi和pj是否具有親戚關係。

【輸出】

p行,每行乙個『yes』或『no』。表示第i個詢問的答案為「具有」或「不具有」親戚關係。

【樣例輸入】

9 7 3

2 45 7

1 38 9

1 25 6

2 32 5

2 43 8

【樣例輸出】

noyes

no(1)具體操作:

① 由此用某個元素所在樹的根結點表示該元素所在的集合;

② 判斷兩個元素時候屬於同乙個集合的時候,只需要判斷他們所在樹的根結點是否一樣即可;

③ 也就是說,當我們合併兩個集合的時候,只需要在兩個根結點之間連邊即可。

(2)元素的合併圖示:

(3)判斷元素是否屬於同一集合:

用father[i]表示元素i的父親結點

faher[1]:=1;faher[2]:=1;faher[3]:=1;faher[4]:=5;faher[5]:=3。

參考程式:

#include

int father[5010];

int find(int a)

void merge(int x,int y)

int main()

for(i=0;i}return 0;

}

並查集基礎

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

並查集基礎

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

並查集基礎

並查集 disjoint set 是一種可以動態維護若干個不重疊的集合,並支援合併與查詢的資料結構。1.get,查詢乙個元素屬於哪個集合 2.merge 把兩個集合合併成乙個集合 並查集的儲存 使用乙個陣列fa儲存父節點 初始根的父節點設為自己,一開始每個節點自成乙個集合。int fa size f...