hdu1232 并查集

        并查集者,并也,查也,统统归于集合也。即其是关于集合的操作——并,查。所以并查集的关键也就是对集合的合并与对元素的查找,查找某一元素属于哪个集合。一般情况下定义一个数组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;
}

       

原文地址:https://www.cnblogs.com/orangeblog/p/2240664.html