File tree Expand file tree Collapse file tree 1 file changed +21
-3
lines changed Expand file tree Collapse file tree 1 file changed +21
-3
lines changed Original file line number Diff line number Diff line change @@ -38,11 +38,22 @@ void init() {
38
38
father[i] = i;
39
39
}
40
40
}
41
- // 并查集里寻根的过程
41
+ // 并查集里寻根的过程,这里递归调用当题目数据过多,递归调用可能会发生栈溢出
42
+
42
43
int find (int u) {
43
44
return u == father[ u] ? u : father[ u] = find(father[ u] ); // 路径压缩
44
45
}
45
46
47
+ // 使用迭代的方法可以避免栈溢出问题
48
+ int find(int x) {
49
+ while (x != parent[ x] ) {
50
+ // 路径压缩,直接将x链接到其祖先节点,减少树的高度
51
+ parent[ x] = parent[ parent[ x]] ;
52
+ x = parent[ x] ;
53
+ }
54
+ return x;
55
+ }
56
+
46
57
// 判断 u 和 v是否找到同一个根
47
58
bool isSame(int u, int v) {
48
59
u = find(u);
@@ -75,6 +86,8 @@ void join(int u, int v) {
75
86
76
87
此时我们就可以直接套用并查集模板。
77
88
89
+ 本题在join函数调用find函数时如果是递归调用会发生栈溢出提示,建议使用迭代方法
90
+
78
91
使用 join(int u, int v)将每条边加入到并查集。
79
92
80
93
最后 isSame(int u, int v) 判断是否是同一个根 就可以了。
@@ -93,8 +106,13 @@ private:
93
106
}
94
107
}
95
108
// 并查集里寻根的过程
96
- int find(int u) {
97
- return u == father[u] ? u : father[u] = find(father[u]);
109
+ int find(int x) {
110
+ while (x != parent[x]) {
111
+ // 路径压缩,直接将x链接到其祖先节点,减少树的高度
112
+ parent[x] = parent[parent[x]];
113
+ x = parent[x];
114
+ }
115
+ return x;
98
116
}
99
117
100
118
// 判断 u 和 v是否找到同一个根
You can’t perform that action at this time.
0 commit comments