0)概述
- 并查集是用于处理不相交集合的合并与查询的树形数据结构
1)数据结构
const int maxn=2e5+5;
int fa[maxn];
2)核心函数
1:find函数
int find(int x) {
if(x==fa[x])
return x;
else
return fa[x]=find(fa[x]);
}
2:join函数
void join(int a,int b) {
fa[find(a)]=find(b);
}
3)模板
- 下列案例中:输入
1
1
2
1\ 1\ 2
1 1 2 表示把并查集
1
1
1 和
2
2
2 连接起来,输入
2
1
2
2\ 1\ 2
2 1 2 表示判断
1
1
1 和
2
2
2 是否属于同一并查集
- 关键点:1)初始化时将每个节点的父节点初始化为自己;2)如果
a
a
a 和
b
b
b 的父节点相同,则表明二者处于同一并查集中
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+4;
int fa[maxn];
int find(int x) {
if(x==fa[x])
return x;
else
return fa[x]=find(fa[x]);
}
void join(int l,int r) {
fa[find(l)]=find(r);
}
int main() {
int n,m;
cin>>n>>m;
int op,l,r;
for(int i=1;i<=n;i++)
fa[i]=i;
while(m--) {
cin>>op>>l>>r;
if(op==1)
join(l,r);
else if(op==2) {
if(find(l)==find(r))
cout<<"Y\n";
else
cout<<"N\n";
}
}
return 0;
}