并查集(学习笔记)

用处:

并查集是一种用来处理不同集合之间的关系的算法。正如它名字一样它本身就是一个可以合并,查询的树形集合。它可以用来做分组类型的题。具体功能,拓展和原理

实现:

基本功能的实现:

\(1.\)初始化,我们令每一个参加计算的点的父亲设为他自己:即初始时就有\(n\)个集合,每个点就算一个;

void init(){
	for(int i=1;i<=n;i++){
		fa[i]=i;
	}
}

\(2.\)查询\(find()\)用来查找每一颗集合树的根。这样可以用来判断是否在同一集合,和进行合并操作;我们只需要用递归依次向上找父节点,直到找到一个点的父节点就是它自己即可。为了优化效率,及防止它形成一个链,使每次的查询都很慢。我们可以在递归时让每一个节点指向根节点;

int find(int x){
	if(fa[x]==x)return x;
	return fa[x]=find(fa[x]);
}

\(3.\)合并\(merge\)。用来合并两个集合,只需要将一颗树根节点的父节点指向另一颗树的根节点即可。注意要先判断两个集合是否在同一集合

void merge(int x,int y){
	if(find(x)==find(y))return;
	fa[find(x)]=find(y);
}

练习:

\(1\).P1111 修复公路 题解
\(2\).P1525 [NOIP2010 提高组] 关押罪犯 题解
\(3.Cheap Robot\) 题解

posted @ 2025-01-20 19:06  XichenOC  阅读(14)  评论(0)    收藏  举报