Skip to content

Commit 17a4c20

Browse files
committed
update
1 parent 0858cb3 commit 17a4c20

2 files changed

Lines changed: 10 additions & 13 deletions

File tree

library/dsu/dsu_bipartite.hpp

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@
33
//! DSU with support for parity of path to root for online
44
//! bipartite check
55
struct dsu_bipartite {
6-
int num_sets;
76
vi p, is_bi, parity;
8-
dsu_bipartite(int n):
9-
num_sets(n), p(n, -1), is_bi(n, 1), parity(n) {}
7+
dsu_bipartite(int n): p(n, -1), is_bi(n, 1), parity(n) {}
108
int f(int v) {
119
if (p[v] < 0) return v;
1210
int root = f(p[v]);
@@ -15,17 +13,16 @@ struct dsu_bipartite {
1513
}
1614
bool join(int u, int v) {
1715
int root_u = f(u), root_v = f(v);
18-
if (root_u == root_v) {
19-
if (parity[u] == parity[v]) is_bi[root_u] = 0;
16+
int new_parity = parity[v] ^ parity[u];
17+
u = root_u, v = root_v;
18+
if (u == v) {
19+
is_bi[u] &= new_parity;
2020
return 0;
2121
}
22-
if (p[root_u] > p[root_v]) {
23-
swap(u, v);
24-
swap(root_u, root_v);
25-
}
26-
is_bi[root_u] &= is_bi[root_v];
27-
parity[root_v] = parity[v] ^ 1 ^ parity[u];
28-
p[root_u] += p[root_v], p[root_v] = root_u, num_sets--;
22+
if (p[u] > p[v]) swap(u, v);
23+
is_bi[u] &= is_bi[v];
24+
parity[v] = new_parity ^ 1;
25+
p[u] += p[v], p[v] = u;
2926
return 1;
3027
}
3128
int size(int v) { return -p[f(v)]; }

tests/library_checker_aizu_tests/dsu/dsu_bipartite.test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ int main() {
4343
adj[u].push_back(v);
4444
adj[v].push_back(u);
4545
} else cout << (dsu.f(u) == dsu.f(v)) << '\n';
46-
if (rnd<int>(0, 20'000) == 0) check();
46+
if (i <= 20 || rnd<int>(0, 20'000) == 0) check();
4747
}
4848
check();
4949
return 0;

0 commit comments

Comments
 (0)