【模板】并查集
题目描述
有n个元素,你需要完成集合的合并和判断两个元素是否在同一集合中这两种操作。
输入格式
第一行包含两个整数n,m,表示共有n个元素和m次操作。接下来m行,每行包含三个整数zi,xi,yiz_i,x_i,y_izi,xi,yi.当zi=1z_i=1zi=1时,讲xix_ixi与yiy_iyi所在的集合合并。当zi=2z_i=2zi=2时,判断xix_ixi与yiy_iyi是否在同一集合内,是的话输出“Y”,否则输出“N”。
输出格式
对于每一个zi=2z_i=2zi=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;
}

这篇博客介绍了如何使用C++实现并查集模板,详细阐述了并查集的基本操作,包括集合的合并和判断元素是否在同一集合内。提供了解题思路及样例输入输出,帮助读者理解并掌握这一数据结构。
255

被折叠的 条评论
为什么被折叠?



