并查集
2019-08-18

RT

并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题,常常在使用中以森林来表示(一般用数组实现)。

实现核心

1.初始化:

把每个点所在集合初始化为其自身。

通常来说,这个步骤在每次使用该数据结构时只需要执行一次,无论何种实现方式,时间复杂度均为O(N)。

2.查找

查找元素所在的集合,即根节点。

3.合并

将两个元素所在的集合合并为一个集合。
通常来说,合并之前,应先判断两个元素是否属于同一集合,这可用上面的“查找”操作实现。

代码实现

1.初始化

int f[];  //定义数组f,f[i]表示节点i的父节点
for(int i=1;i<=n;i++) f[i]=i;  //n为节点数

2.查找

首先,我们需要引入一个路径压缩的概念。

如果,查找中路径较长(形成一个长长的链),时间复杂度就会比较高。

思想

每次查找的时候,如果路径较长,则修改信息,以便下次查找的时候速度更快。

实现

1.找到根结点。

2.修改查找路径上的所有节点,将它们都指向根结点。

int find(int s){  //查找节点s
	if(f[s]!=s) f[s]=find(f[s]);
	return f[s];
}

3.合并

int u,v;  //需要合并的节点u和节点v
int x=find(u);
int y=find(v);  //x,y为节点u和节点v的父节点
if(x!=y) f[y]=x;  //或f[x]=y;

相关题目

P3367 【模板】并查集

P2024 [NOI2001]食物链

P1197 [JSOI2008]星球大战

P2323 [HNOI2006]公路修建问题

P2835 刻录光盘

P3958 奶酪