【模板】并查集
题目描述
有n个元素,你需要完成集合的合并和判断两个元素是否在同一集合中这两种操作。
输入格式
第一行包含两个整数n,m,表示共有n个元素和m次操作。接下来m行,每行包含三个整数 z i , x i , y i z_i,x_i,y_i zi,xi,yi.当 z i = 1 z_i=1 zi=1时,讲 x i x_i xi与 y i y_i yi所在的集合合并。当 z i = 2 z_i=2 zi=2时,判断 x i x_i xi与 y i y_i yi是否在同一集合内,是的话输出“Y”,否则输出“N”。
输出格式
对于每一个 z i = 2 z_i=2 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
解题思路
并查集模板,用自定义函数Merge实现集合合并,还有查找查找每个集合代表元素,利用两集合的代表元素是否相同来判断它们是否在同一集合中。
Code
#include<iostream>
#include<algorithm>
using namespace std;
int fa[10000];
inline int cz(int x)
{
if(fa[x]==x) return x;//该节点的父亲指向自己,本身是集合代表元素
else return fa[x]=cz(fa[x]);//该节点不是集合代表元素,递归求代表元素,将该节点的父亲指向代表元素
}
inline void Merge(int x,int y)
{
x=cz(x);y=cz(y);//找出两集合的代表元素
if(x!=y) fa[x]=y;//如不在同一集合,将两集合合并
return;
}
int main()
{
int n,m;
int zi,xi,yi;
cin>>n>>m;
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=m;i++)
{
cin>>zi>>xi>>yi;
if(zi==1) Merge(xi,yi);
else
{
if(cz(xi)==cz(yi))
cout<<"Y"<<endl;
else cout<<"N"<<endl;
}
}
return 0;
}