【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;
}