并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。
初始化:
for(int i=0;i<n;i++){
p[i]=i;//每个点单独为一个集合(自己是自己的爸爸)
}
查:
int find (int x) {
return x == p[x] ? x: p[x] = find(x) ;//搜索直到找到根节点(祖宗)
}
并:
void unity(int x,int y){
x=find(x); y=find(y);
p[x]=y;//x的根节点(祖宗)变成y根节点(祖宗)的儿子
}