【ybtoj 高效进阶 3.1】【并查集】 并查集

【ybtoj 高效进阶 3.1】【并查集】 并查集

题目

在这里插入图片描述
在这里插入图片描述


解题思路

并查集模板题
合并两个不一样的集合
在这里插入图片描述
查找元素所在集合
在这里插入图片描述


代码

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,z,x,y,fa[10010];
int find(int t)
{
    
    
	if (fa[t]==t)  //本身即是根
	   return t;
	   else return fa[t]=find(fa[t]);  //路径压缩
}
void merge(int x,int y)
{
    
    
	 int fx,fy;
	 fx=find(x);
	 fy=find(y);  //分别找到两个元素
	 if (fx!=fy) fa[fx]=fy;  //不在同一集合
}
int main()
{
    
    
    scanf("%d%d",&n,&m); 
    for (int i=1;i<=n;i++) fa[i]=i;  //初始化,自己是自己的根
	for (int i=1;i<=m;i++)
	{
    
    
	    scanf("%d%d%d",&z,&x,&y);
		if (z==1) 
		   merge(x,y);  //合并集合
		   else if (find(x)==find(y))  //判断是否在同一集合
		           printf("Y\n");
				   else printf("N\n"); 
	}	
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_45621109/article/details/115354839