题目描述
如题,现在有一个并查集,你需要完成合并和查询操作。
输入格式
第一行包含两个整数 N,M ,表示共有 N 个元素和 M 个操作。
接下来 M 行,每行包含三个整数 Zi,Xi,Yi 。
当Zi=1 时,将 Xi 与 Yi 所在的集合合并。
当Zi=2 时,输出 Xi 与 Yi 是否在同一集合内,是的输出
Y
;否则输出N
。输出格式
对于每一个 Zi=2 的操作,都有一行输出,每行包含一个大写字母,为
Y
或者N
。输入输出样例
输入 #1复制
4 7 2 1 2 1 1 2 2 1 2 1 3 4 2 1 4 1 2 3 2 1 4输出 #1复制
N Y N Y说明/提示
对于 30%30% 的数据,N≤10,M≤20。
对于 70%70% 的数据,N≤100,M≤10^3。
对于 100%100% 的数据,1≤N≤10^4,1≤M≤2×10^5,1≤Xi,Yi≤N,Zi∈{1,2}。
代码:
#include <bits/stdc++.h>
using namespace std;
int n,m;
int anc[10010];//存每个人的祖先
int find(int c){
if(c!=anc[c]) anc[c]=find(anc[c]);//如果C的祖先不是他自己,找他祖先的祖先。
return anc[c];
}
int main(){
cin >> n >> m;
for(int i = 1;i<=n;i++){
anc[i]=i;//每个人的祖先初始化为自己
}
for(int i = 1;i<=m;i++){//m次操作
int z,x,y;
cin >> z >> x >> y;
if(z==1){//并
int t1=find(x),t2=find(y);
if(t1!=t2) anc[t1]=t2;//如果x的祖先和y的祖先不一样,集合合并,x的祖先的祖先变为y的祖先
}else{//查
int t1=find(x),t2=find(y);
if(t1==t2){//判断是否在一个集合内
cout << "Y\n";
}else cout << "N\n";
}
}
return 0;
}