并查集:集合的并、查找某元素在什么集合。
//数组形式存储
typedef struct{
ElementType Data;
int Parent; //表示父节点下标,根节点为负数(绝对值为子节点个数)
}SetType;
int Find(SetType S[], ElementType X)
{
//在数组S中查找值为X的元素所属的集合
//MaxSize是全局变量,为数组S的最大长度
int i;
for(i=0; i<MaxSize && S[i].Data != X;i++);
if(i >= MaxSize)
return -1;
//未找到X,返回-1
for(;S[i].Parent >= 0;i = S[i].Parent);
return i;
// 找到X所属集合,返回树根结点在数组S中的下标
}
void Union(SetType s[], ElementType x1, ElementType x2)
{ //合并x1所在集合和x2所在集合,小的合并到大的
int root1, root2;
root1 = Find(s,x1);
root2 = Find(s,x2);
if(root1 == -1 || root2 == -1)
return;
if(root1>root2)
{
s[root2].Parent += s[root1].Parent;
s[root1].Parent = root2;
}
if(root1<root2)
{
s[root1].Parent += s[root2].Parent;
s[root2].Parent = root1;
}