洛谷 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;
}
posted @ 2020-12-03 10:03  Seaway-Fu  阅读(122)  评论(0编辑  收藏  举报