算法学习(1):并查集

并查集

并查集主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作:
合并(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";
	}
} 

posted on 2021-04-30 17:17  小星◎  阅读(56)  评论(0)    收藏  举报

导航