朋友圈
[M]
#并查集 详解并查集具体实现过程
并查集可以整合为一个struct
- 数据成员: + parent【n】 + size【n】优化并查集时间:表示以i为节点的并查集的size===优化:将小size union 到大size上= + help【n】在find时记录结点路径上所有的结点:进行路径压缩 + number 表示有多少个并查集 注意初始化成员
public:
int parent[n];
int size[n];
int help[n];
int number=n;
u(){
for (int i = 0; i < n; i++) {
parent[i] = i;
size[i] = 1;
}
}
u(){}
- 成员函数: + find:找到根结点,同时进行路径压缩
int find(int i) {
int m = 0;
while (parent[i] != i) {
help[m++] = i;
i = parent[i];
}
for (int k = m; k >= 0; k--)
parent[help[k]] = i;//注意这里是help
return i;
}
- union整合两个结点
void unio(int i, int j) {
int m = find(i); int n = find(j);
if (find(i) != find(j)) {
if (size[m] >= size[n]) {
parent[n] = m;
size[m] += size[n];
}
else {
parent[m] = n;
size[n] += size[m];
}
}
number--;注意number改变
}
最后根据题意返回数据即可