並查集基礎

2021-07-08 19:04:27 字數 2149 閱讀 2444

並查集問題描述:

在一些有n個元素的集合應用問題中,我們通常是在開始時讓每個元素構成乙個單元素的集合,然後按一定順序將屬於同一組的元素所在的集合合併,其間要反覆查詢乙個元素在哪個集合中。這一類問題近幾年來反覆出現在資訊學的國際國內賽題中,其特點是看似並不複雜,但資料量極大,若用正常的資料結構來描述的話,往往在空間上過大,計算機無法承受;即使在空間上勉強通過,執行的時間複雜度也極高,根本就不可能在比賽規定的執行時間(1~3秒)內計算出試題需要的結果,只能用並查集來描述。

定義
並查集是一種樹型的資料結構,用於處理一些不相交集合(disjoint sets)的合併及查詢問題。常常在使用中以森林來表示。

集就是讓每個元素構成乙個單元素的集合,也就是按一定順序將屬於同一組的元素所在的集合合併。

主要操作編輯

初始化
把每個點所在集合初始化為其自身。

通常來說,這個步驟在每次使用該資料結構時只需要執行一次,無論何種實現方式,時間複雜度均為o(n)。

查詢 查詢元素所在的集合,即根節點。

合併 將兩個元素所在的集合合併為乙個集合。

通常來說,合併之前,應先判斷兩個元素是否屬於同一集合,這可用上面的「查詢」操作實現。

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

規定:x和y是親戚,y和z是親戚,那麼x和z也是親戚。如果x,y是親戚,那麼x的親戚都是y的親戚,y的親戚也都是x的親戚。(人數≤5000,親戚關係≤5000,詢問親戚關係次數≤5000)。

資料輸入:

第一行:三個整數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個詢問的答案為「具有」或「不具有」親戚關係

樣例:

input

6 5 3

1 2

1 5

3 4

5 2

1 3

1 4

2 3

5 6

output

yes

yes

no**1:

#include

#include

#include

#include

using

namespace

std;

int father[50002],a,b,m,n,p;

int find(int x)

int main()

for(i=1;i<=p;i++)

return

0;}

**2:

# include 

# include

using

namespace

std;

# define n 100

int father[n];

void init(int n);//初始化並查集

void union_(int x,int y);//合併兩個元素所在的集合

bool same(int x,int y);//判斷兩個元素是否屬於同乙個集合

int getfather(int x);//獲取根結點

int main()

for(int i=0;iscanf("%d%d",&a,&b);

if(same(a,b))else}}

return0;}

void init(int n)

void union_(int x,int y)

int getfather(int x)

return x;

}//每次查詢,都把需要查詢的點到根的路徑上的所有點都記錄為根

/*int getfather(int x)

return father[x];}*/

bool same(int x,int y)

並查集基礎

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

並查集基礎

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

並查集 並查集

本文參考了 挑戰程式設計競賽 和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 ...