题目介绍
如题,现在有一个并查集,你需要完成合并和查询操作。
输入格式
第一行包含两个整数 N,M表示共有 N个元素和 M 个操作。
接下来 M 行,每行包含三个整数 Xi,Yi,Zi。
当Zi=1时,将 Xi和Yi所在的集合合并。
当Zi=2时,输出Xi和Yi是否在同一集合内,是的输出 Y 否则输出 N。
输出格式
对于每一个Zi=2的操作,都有一行输出,每行包含一个大写字母,为Y或者N。
输入输出样例
4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4
N
Y
N
Y
AC代码
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100001;
int s[N];
int find(int a)//查询,即查询所属集合,并实现了路径压缩。
{
if(s[a]!=a)
s[a]=find(s[a]);
return s[a];
}
int main()
{
int n,m;
int x,y,z;
int i,j,k;
int l;
cin>>n>>m;
for(i=0;i<=n;i++)//并查集的初始化
s[i]=i;
while(m--)
{
cin>>l>>x>>y;
if(l==1)
s[find(x)]=find(y);
/*等价于x=find(x),y=find(y);
s[x]=y;*/
else
{
if(find(x)==find(y))//若所属同一集合,则输出Y;
cout<<"Y"<<endl;
else//若不属于同一集合,则输出N;
cout<<"N"<<endl;
}
}
return 0;
}