并查集
并查集主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作:
合并(Union):把两个不相交的集合合并为一个集合。
查询(Find):查询两个元素是否在同一个集合中。
初始化:
fa[i]=i;
Find:
无压缩
int Find(int x) {
if(fa[x]==x) return x;
else return Find(fa[x]);
}压缩
int Find(int x) {
// if(x!=fa[x]) fa[x]=Find(fa[x]);
// return fa[x];
return x==fa[x] ? x : (fa[x]=Find(fa[x]));//简写
}Union:
void Union(int x,int y) {
fa[Find(x)]=Find(y);
}例(洛谷P1551):
https://www.luogu.com.cn/problem/P1551
#include<bits/stdc++.h>
using namespace std;
int fa[5005];
int Find(int x) {
// if(x!=fa[x]) fa[x]=Find(fa[x]);
// return fa[x];
return x==fa[x] ? x : (fa[x]=Find(fa[x]));
}
void Union(int x,int y) {
fa[Find(x)]=Find(y);
}
int main() {
int n,m,p;
cin>>n>>m>>p;
for(int i=1;i<=n;++i) fa[i]=i;
for(int i=1;i<=m;++i) {
int x,y;
cin>>x>>y;
Union(x,y);
}
for(int i=1;i<=p;++i) {
int x,y;
cin>>x>>y;
if(Find(x)==Find(y)) {
cout<<"Yes\n";
}
else cout<<"No\n";
}
} 
京公网安备 11010502036488号