const int maxn = 1000;
int father[maxn];
void init(){//初始化父亲数组
for(int i = 0; i < n; i++){
father[i] = i;
}
}
int findFather(int a){//查
int x = a;
while(a != father[a]) a = father[a];
while(x != a){//路径压缩
int tmp = father[x];
father[x] = a;
x = tmp;
}
return a;
}
void Union(int a, int b){//并
int fa = findFather(a);
int fb = findFather(b);
if(fa != fb){//若是题目有要求说序号小的或大的当祖先,那么此处可以灵活修改
fa = father[fb];
}
}
常用技巧:
一般会开一个is_root数组来统计并查集的个数。也即遍历所有给定结点,找到其祖先,并散列到is_root中,若不让统计个数,则直接置一,否则自增即可。特别的,若要求输出每一个并查集的所有成员,则单独开辟一个member向量数组(vector<node> member[maxn]),并以散列的方式来存储成员信息。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。