並查集 親戚 relation

2021-08-21 18:44:11 字數 1151 閱讀 7505

時間限制: 1 sec  記憶體限制: 128 mb

提交: 126  解決: 76

[提交][狀態][討論版][命題人:quanxing]

或許你並不知道,你的某個朋友是你的親戚。他可能是你的曾祖父的外公的女婿的外甥女的表姐的孫子。如果能得到完整的家譜,判斷兩個人是否是親戚應該是可行的,但如果兩個人的最近公共祖先與他們相隔好幾代,使得家譜十分龐大,那麼檢驗親戚關係實非人力所能及。在這種情況下,最好的幫手就是計算機。為了將問題簡化,你將得到一些親戚關係的資訊,如marry和tom是親戚,tom和ben是親戚,等等。從這些資訊中,你可以推出marry和ben是親戚。請寫乙個程式,對於我們的關於親戚關係的提問,以最快的速度給出答案。

輸入由兩部分組成。

第一部分以n,m開始。n為問題涉及的人的個數(1≤n≤20000)。這些人的編號為1,2,3,…, n。下面有m行(1≤m≤1000000),每行有兩個數ai,bi

,表示已知ai 和bi

是親戚。

第二部分以q開始。以下q行有q個詢問(1≤ q ≤1000000),每行為ci,di

,表示詢問ci 和di

是否為親戚。

測試資料比較水

對於每個詢問ci,di

,輸出一行:若ci 和di

為親戚,則輸出「yes」,否則輸出「no」。

10 7

2 45 7

1 38 9

1 25 6

2 33

3 47 10

8 9

yes

noyes

#includeusing namespace std;

int n,m,q,pre[20001],ai,bi,ci,di;

//找爹遞迴函式

int find(int x)

return r;

}//合併兩個子集合

void join(int x,int y)

int main()

cin>>q;

for(int i=0;i>ci>>di;

if(find(ci)==find(di))cout<<"yes"

return 0;

}

親戚 並查集

若某個家族人員過於龐大,要判斷兩個是否是親戚,確實還很不容易,現在給出某個親戚關係圖,求任意給出的兩個人是否具有親戚關係。規定 x和y是親戚,y和z是親戚,那麼x和z也是親戚。如果x,y是親戚,那麼x的親戚都是y的親戚,y的親戚也都是x的親戚。第一行 三個整數n,m,p,n 5000,m 5000,...

並查集(親戚)

include using namespace std int n int parent 100 void ufset 初始化 int find int x 返回第x節點所屬集合的根結點 return i void union int r1,int r2 將兩個不同集合的元素進行合併,使兩個集合中任...

並查集(親戚)

問題描述 若某個家族人員過於龐大,要判斷兩個是否是親戚,確實還很不容易,現在給出某個親戚關係圖,求任意給出的兩個人是否具有親戚關係。規定 x和y是親戚,y和z是親戚,那麼x和z也是親戚。如果x,y是親戚,那麼x的親戚都是y的親戚,y的親戚也都是x的親戚。人數 5000,親戚關係 5000,詢問親戚關...