算法:并查集,
s[x]查找上一级祖先
函数init_set():初始化,每个人的祖先都是自己
函数find_set():寻找+更新祖先函数 为节省查找,把s[x]的值更新!!!路径压缩
函数merge_set():将x与y连接欸,把x的值更新为x的祖先,y的值更新为y的祖先,如果祖先不同(既原先不相互连接),让x的祖先等于y的祖先
#include<bits/stdc++.h>
using namespace std;
const int maxn=8e5+5;
int s[maxn];
void init_set(){
for(int i=1;i<=maxn;i++)
s[i]=i; //初始化 每个人的祖先都是自己
}
int find_set(int x){
if(x!=s[x])//x的祖先还是自己吗?是的话返回x,不是的话继续寻找
s[x]=find_set(s[x]); //不断更新s[x]的值
return s[x];
}
void merge_set(int x,int y){
x = find_set(x);
y = find_set(y);
if(x!=y) s[x] = s[y]; //如果x和y的祖先不是一个,那就把y的祖先变成x的祖先(合并并查集)
//祖先的合并!!!
}
int main(){
int op,n,m,x,y;
init_set();
cin >> n>> m;
while(m--){
cin >> op >> x >> y;
if(op==1) merge_set(x,y);
if(op==2){
if(find_set(x)==find_set(y)) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
return 0;
}