并查集就是有关集合的合并和查找算法
对于每个集合来说我们都有一个标志
这个集合中的所有元素都指向这个标志
我们可以定义a的标志为Set【a】
我们就可以利用这些标志来进行集合的合并和查找
在最开始的时候要memset(Set,-1,sizeof(Set));
至于为什么后面可以自己体会
现在介绍两个函数
int find_r(int p)
{
if (Set[p]<0)
return p;
Set[p]=find_r(Set[p]);
return Set[p];
}
void join(int a,int b)
{
int ra=find_r(a),rb=find_r(b);
if (ra!=rb)
{Set[ra]=rb;sum--;}
return;
}
find_r函数是找到元素p所在集合的标志
join函数是将a,b两个元素所在的集合进行合并
记住保险起见一定要加,有一次我没加然后莫名其妙的RE了,都是泪啊
if (ra!=rb)
其实之所以把并查集放在树结构里面是因为这里的find_r运用了树结构和剪枝
这个看图自己体会就好