并查集者,并也,查也,统统归于集合也。即其是关于集合的操作——并,查。所以并查集的关键也就是对集合的合并与对元素的查找,查找某一元素属于哪个集合。一般情况下定义一个数组flag[](数组真是太有用了),用来记录每个元素所属的集合。当然如果用一般情况去查或是合并元素,find()与merge()两个函数的复杂度为n。看起来时间复杂度并不大,但这里我们还可以进行改进,就是利用树结构。
如果 flag[i]= i //i就是这个树的跟
如果flag[i]=j且i<>j j就是i的父节点
根据这个思想完成find()与merge()函数
int find(int x)
{
int r;
r=x;
while(flag[r]!=r)
r=flag[r];
int b=x;
int f;
while(b!=r)
{
f=flag[b];
flag[b]=r;
b=f;
}
}
void merge(int x,int y)
{
int fx;
int fy;
fx=find(x);
fy=find(y);
if(flag[fx]!=fy)
flag[fx]=fy;
}