洛谷 P3367 【模板】并查集
洛谷 P3367 【模板】并查集
题目描述
如题,现在有一个并查集,你需要完成合并和查询操作。
输入格式
第一行包含两个整数 N,MN,M ,表示共有 NN 个元素和 MM 个操作。
接下来 MM 行,每行包含三个整数 Z_i,X_i,Y_iZ**i,X**i,Y**i 。
当 Z_i=1Z**i=1 时,将 X_iX**i 与 Y_iY**i 所在的集合合并。
当 Z_i=2Z**i=2 时,输出 X_iX**i 与 Y_iY**i 是否在同一集合内,是的输出 Y
;否则输出 N
。
输出格式
对于每一个 Z_i=2Z**i=2 的操作,都有一行输出,每行包含一个大写字母,为 Y
或者 N
。
题解:
并查集模板,
代码:
#include<cstdio>
using namespace std;
const int maxn=1e4+4;
int fa[maxn];
int find(int x)
{
return x==fa[x]?x:fa[x]=find(fa[x]);
}
void merge(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
fa[fx]=fy;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
fa[i]=i;
while(m--)
{
int opt,x,y;
scanf("%d%d%d",&opt,&x,&y);
if(opt==1)
merge(x,y);
else
{
int fx=find(x);
int fy=find(y);
if(fx==fy)
printf("Y\n");
else
printf("N\n");
}
}
return 0;
}