题目描述
如题,现在有一个并查集,你需要完成合并和查询操作。
输入格式
第一行包含两个整数N,M,表示共有N个元素和M个操作。
接下来M行,每行包含三个整数Zi,Xi,Yi。
当 Zi=1时,将Xi与Yi所在的集合合并。
当Zi=2时,输出Xi与Yi是否在同一集合内,是的输出Y;否则输出N。
输出格式
对于每一个Zi=2的操作,都有一行输出,每行包含一个大写字母,为Y或者N。
数据范围
1≤n≤104,1≤m≤2×105。
思路:
这道题是并查集的模板题。我们只需要维护好并查集的find和union两个基本操作即可(注意要使用路径压缩,一定要确定好每一个集合的代表元素唯一)。
代码:
1 #include<cstdio>
2 #include<iostream>
3 using namespace std;
4 int father[10001];
5 int m,n,i,x,y,z;
6 int find(int x){
7 if(father[x]!=x){
8 return father[x]=find(father[x]);
9 }else{
10 return x;
11 }
12 }
13 void unionn(int r1,int r2){
14 father[r2]=r1;
15 }
16 int main(){
17 cin>>n>>m;
18 for(i=1;i<=n;i++){
19 father[i]=i;
20 }
21 for(i=1;i<=m;i++){
22 cin>>z>>x>>y;
23 if(z==1){
24 int r1=find(x);
25 int r2=find(y);
26 if(r1!=r2){
27 unionn(r1,r2);
28 }
29 }else if(z==2){
30 if(find(x)==find(y)){
31 cout<<'Y'<<endl;
32 }else{
33 cout<<'N'<<endl;
34 }
35 }
36 }
37 return 0;
38 }