大白话解析:
- 如果两个元素分属于两个不同的集合,则将包含两个元素的所有集合都合并;
- 如果两个集合属于同一集合,则两个元素是连通的,反之,不连通。
例子: 现有时十台电脑,分别为1,2,3,4,5,6,7,8,9,10。1与2连接,2与3,连接,3与5连接,5和9连接,问1与5是否连接?很明显1与5属于同一集合,连接。
用数组来存储
- 查找操作:给定一个x,看x属于哪个集合
int Find(int s[],int x)
{
int i;
for(i=0;i<MAZSIZE&&s[i].data!=x;i++)
;
if(i>=MAZSIZE)
return -1;
for(;s[i].parent>=0;i=s[i].parent)
return i;//递归往上找x所属集合;
}
- 并操作
分别找到x和y两个元素所在集合树的根结点;
如果它们不同根,则将其中一个根结点的父结点指针设置成另一个根结点的数组下标。void Union(int s[],int x,int y) { int Root1,Root2; Root1=Find(s,x); Root2=Find(s,y); if(Root1!=Root2) s[Root2].parent=Root1;//1是2的父结点。 }
尽量将小的集合并到大的集合中去。