概念:
并查集是一种简单的集合表示,它支持一下三种操作:
1)Union(S, Root1, Root2):
把集合S中的子集合Root2并入集合Root1中。要求Root1和Root2互不相交,否则不执行合并。
2)Find(S, x):
查找集合S中单元素x所在的子集合,并返回该子集合的名字。
3)Inital(S):将集合S中的每一个元素都初始为只有一个单元的子集合。
通常用树(森林)的双亲表示作为并查集的存储结构,每个子集合以一棵树表示。所有表示子集合的树构成森林,
存放在双亲表示数组内,通常用数组元素的下表代表元素名,根结点的下标代表子集合名,根结点的双亲位负数。
例如,若设有一个全集合为S = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9},初始化时每个元素自成一个单元子集合,每个子集合的数组值是 -1
经过一段时间的计算,这些子集合合并成三个更大的子集合
S1 = {0, 6, 7, 8}
S2 = {1, 4, 9}
S3 = {2, 3, 5}
此时并查集的树形表示和存储结构如下所示。
为了得到两个子集合的并,只要将其中一个子集合的根结点的双亲指针指向另一个集合的根结点即可。
模板代码如下:
#define SIZE 100 int UFSets[SIZE]; void Initial(int S[]) { for(int i = 0; i < size; i++) S[i] = -1; } int Find(int S[], int x) { while(S[x] >= 0) x = S[x]; return x; } void Union(int S[], int Root1, int Root2) { S[Root2] = Root1; }
时间: 2024-10-12 08:18:38