话不多说,先看代码
#include <bits/stdc++.h>
using namespace std;
#define MAXN 10005
#define MAXM 100005
int n, m;
int arr[MAXN];
//找老大
int Find (int x){
if (x==arr[x])return x;
return arr[x]=Find(arr[x]);
}
int main()
{ cin>>n>>m;
for (int i = 1; i <= n; ++i) {
arr[i]=i;
arr[i]=i;
}
for (int i = 1; i <= m; ++i) {
int Z,X,Y;
cin>>Z>>X>>Y;
if (Z==1){
arr[Find(X)]= Find(Y);
}
if (Z==2){
if (Find(X)==Find(Y)){
cout<<"Y"<<endl;
}
else{
cout<<"N"<<endl;
}
}
}
return 0;
}
根据题目,我们要做的,是在不断合并中,知道两个集合是否是在一个集合中,所谓的老大,就是一个集合中的某个数,该集合中是其他数则为“小弟”,在集合合并时,只要将一个”老大“变成另一个”老大“的“小弟”,然后逐个将一个集合的所有数连接到另一个集合的“老大“上去
最后判断两个数的”老大“同一个即可;