Merge pull request #2557 from buaahjy/develop

1971:解决并查集路径压缩递归可能会造成栈溢出问题
This commit is contained in:
程序员Carl
2024-06-12 11:08:29 +08:00
committed by GitHub

View File

@ -38,11 +38,22 @@ void init() {
father[i] = i;
}
}
// 并查集里寻根的过程
// 并查集里寻根的过程,这里递归调用当题目数据过多,递归调用可能会发生栈溢出
int find(int u) {
return u == father[u] ? u : father[u] = find(father[u]); // 路径压缩
}
// 使用迭代的方法可以避免栈溢出问题
int find(int x) {
while (x != parent[x]) {
// 路径压缩直接将x链接到其祖先节点减少树的高度
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
}
// 判断 u 和 v是否找到同一个根
bool isSame(int u, int v) {
u = find(u);
@ -75,6 +86,8 @@ void join(int u, int v) {
此时我们就可以直接套用并查集模板。
本题在join函数调用find函数时如果是递归调用会发生栈溢出提示建议使用迭代方法
使用 join(int u, int v)将每条边加入到并查集。
最后 isSame(int u, int v) 判断是否是同一个根 就可以了。
@ -93,8 +106,13 @@ private:
}
}
// 并查集里寻根的过程
int find(int u) {
return u == father[u] ? u : father[u] = find(father[u]);
int find(int x) {
while (x != parent[x]) {
// 路径压缩直接将x链接到其祖先节点减少树的高度
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
}
// 判断 u 和 v是否找到同一个根