資料結構(並查集 set

2021-08-21 12:34:03 字數 1691 閱讀 5908

伊卡洛斯很愛吃西瓜。一次,他來到乙個西瓜攤旁,發現水果攤有nn個西瓜,西瓜有紅色、黃色、綠色、藍色……等等數不清的顏色。 

伊卡洛斯很想知道知道一些資訊,便於老闆交談了起來。 

當老闆的話的第乙個字元為」a」時,老闆會告訴伊卡洛斯一些資訊,格式如下: 

a x y 1a x y 1 這句話表示第xx個西瓜和第yy個西瓜是同一種顏色的。 

a x y 2a x y 2 這句話表示第xx個西瓜和第yy個西瓜是不同種顏色的。

當然,為了考驗伊卡洛斯有沒有認真聽, 老闆也會時不時問伊卡洛斯一些問題,格式如下: 

q x yq x y 這句話表示詢問第xx個西瓜和第yy個西瓜是不是同一種顏色,如果確定為同一種顏色,伊卡洛斯需要回答1;確定為不同種顏色,伊卡洛斯需要回答2;無法確定時伊卡洛斯回答3。 

注意,伊卡洛斯是根據已獲得的資訊來回答的。也就是只有這個問題之前的資訊才為已知資訊。

老闆說,只有回答對他全部的問題,伊卡洛斯才能吃到瓜,他聰明的想到了讓你來幫助他。

input

第一行包含兩個整數nn和mm,nn是西瓜總數,mm是以aa或qq開頭的老闆的話總和。   

以下mm行,每行包含一條老闆的話。形式有a x y 1a x y 1或a x y 2a x y 2或q x yq x y。 

1≤n≤100000 1≤m≤200000 1≤x,y≤n1≤n≤100000 1≤m≤200000 1≤x,y≤n 

資料保證沒有矛盾

output

對於每一條qq指令,輸出1/2/3代表兩個西瓜顏色的關係。

sample input

6 9  

a 1 2 1

a 1 3 1

a 1 4 2

q 2 4

q 1 6

a 3 6 1

a 4 5 2

q 1 5

q 1 6

sample output

2

33

1

hint

西瓜的顏色可以有無數多種!

題解:因為西瓜有無數種不能像只有兩種一樣如果x與y不同,y與z不同那麼x與z就相同那樣來做題,這裡我們需要用set來存放與x不同的y,與y不同的x,並且都是對它們的根節點操作,因為x根節點與y的根節點不同那麼x,y也不相同。

當fnd(x)==fnd(y)時表示相同,當fnd(x)!=fnd(y)時如果x的根節點的set集合裡面有的y根節點,或y的根節點得set集合裡面有x的根節點就表明x,y不同,否則不能判斷。。。

ac**:

#include#include#include#include#includeusing namespace std;

const int maxn=100005;

sets[maxn];

int parent[maxn];

int fnd(int x)

bool uni(int x,int y)

return true;

}return false;

}int main()

else

}else

}return 0;

}

資料結構 並查集

並查集,顧名思義,合併 查詢 集合 並查集是一種樹型的資料結構,用於處理一些不相交集合 disjoint sets 的合併及查詢問題。常常在使用中以森林來表示。對於概念等等的這裡不再贅述,直接講解應用。應用1 判斷圖中有多少聯通分量 或者圖是否聯通 聯通分量 1 hdu 1213 應用2 判斷圖是否...

資料結構 並查集

time limit 1000ms memory limit 65536k 某城市有n個人,現在給定關於n個人的m條資訊,m條資訊是兩個人在同乙個小區,根據所給資訊,判斷這個城市最多可能有多少個小區。n個人編號為1 n。多組輸入。每組第一行有兩個整數n,m 2 n 50000,0 m n 2 接下來...

資料結構 並查集

一 基本概念 並查集是一種樹型的資料結構,用於處理一些不相交集合 disjoint sets 的合併及查詢問題。常常在使用中以森林來表示。集就是讓每個元素構成乙個單元素的集合,也就是按一定順序將屬於同一組的元素所在的集合合併。在一些有n個元素的集合應用問題中,通常是在開始時讓每個元素構成乙個單元素的...