伊卡洛斯很愛吃西瓜。一次,他來到乙個西瓜攤旁,發現水果攤有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 9sample outputa 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
2hint33
1
西瓜的顏色可以有無數多種!
題解:因為西瓜有無數種不能像只有兩種一樣如果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個元素的集合應用問題中,通常是在開始時讓每個元素構成乙個單元素的...