mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 00:22:55 +08:00
Merge pull request #2557 from buaahjy/develop
1971:解决并查集路径压缩递归可能会造成栈溢出问题
This commit is contained in:
@ -38,11 +38,22 @@ void init() {
|
|||||||
father[i] = i;
|
father[i] = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 并查集里寻根的过程
|
// 并查集里寻根的过程,这里递归调用当题目数据过多,递归调用可能会发生栈溢出
|
||||||
|
|
||||||
int find(int u) {
|
int find(int u) {
|
||||||
return u == father[u] ? u : father[u] = find(father[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是否找到同一个根
|
// 判断 u 和 v是否找到同一个根
|
||||||
bool isSame(int u, int v) {
|
bool isSame(int u, int v) {
|
||||||
u = find(u);
|
u = find(u);
|
||||||
@ -75,6 +86,8 @@ void join(int u, int v) {
|
|||||||
|
|
||||||
此时我们就可以直接套用并查集模板。
|
此时我们就可以直接套用并查集模板。
|
||||||
|
|
||||||
|
本题在join函数调用find函数时如果是递归调用会发生栈溢出提示,建议使用迭代方法
|
||||||
|
|
||||||
使用 join(int u, int v)将每条边加入到并查集。
|
使用 join(int u, int v)将每条边加入到并查集。
|
||||||
|
|
||||||
最后 isSame(int u, int v) 判断是否是同一个根 就可以了。
|
最后 isSame(int u, int v) 判断是否是同一个根 就可以了。
|
||||||
@ -93,8 +106,13 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 并查集里寻根的过程
|
// 并查集里寻根的过程
|
||||||
int find(int u) {
|
int find(int x) {
|
||||||
return u == father[u] ? u : father[u] = find(father[u]);
|
while (x != parent[x]) {
|
||||||
|
// 路径压缩,直接将x链接到其祖先节点,减少树的高度
|
||||||
|
parent[x] = parent[parent[x]];
|
||||||
|
x = parent[x];
|
||||||
|
}
|
||||||
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 判断 u 和 v是否找到同一个根
|
// 判断 u 和 v是否找到同一个根
|
||||||
|
Reference in New Issue
Block a user