#include<iostream>
#include<stdio.h>
using namespace std;
struct bcj{
int f[100010],n;
void memsets(){
for (int i=1;i<=n;i++){
f[i]=i;
}
}
int get(int p){//从p出发 最后会走到哪里
if (f[p]==p) return p;
else return f[p]=get(f[p]);
}
void merge(int p1,int p2){//把p1p2并在一起
int f1=get(p1);
int f2=get(p2);
f[f1]=f2;
}
bool query(int p1,int p2){//询问p1p2是否在一起
return get(p1)==get(p2);
}
};
bcj z;
int read(){
int x=0,f=1;
char c=getchar();
while (c<'0'||c>'9'){
if (c=='-'){
f=-1;
}
c=getchar();
}
while (c>='0'&&c<='9'){
x=x*10+(c-'0');
c=getchar();
}
return x*f;
}
int main(){
z.n=read();
int m;
m=read();
z.memsets();
for (int i=1;i<=m;i++){
int op;
op=read();
if (op==1){
int x;
x=read();
printf("%d\n",z.get(x));
}
if (op==2){
int x,y;
x=read();
y=read();
z.merge(x,y);
}
if (op==3){
int x,y;
x=read();
y=read();
int o=z.query(x,y);
if (o==true){
printf("true\n");
}
else{
printf("false\n");
}
}
}
return 0;
}
手打并查集
于 2022-10-04 14:45:58 首次发布