Skip to content

Commit 4a69b08

Browse files
committed
Revert "trying some optimizations"
This reverts commit 5540481.
1 parent 5540481 commit 4a69b08

File tree

3 files changed

+21
-19
lines changed

3 files changed

+21
-19
lines changed

library/graphs/strongly_connected_components/offline_incremental_scc.hpp

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,35 +16,37 @@ vi offline_incremental_scc(vector<array<int, 2>> eds,
1616
vi ids(n, -1), joins(m, m), idx(m), vs(n), scc_id;
1717
iota(all(idx), 0);
1818
vector<vi> adj;
19-
auto divide_and_conquer = [&](auto&& self, int el,
20-
int er, int tl, int tr) {
19+
auto divide_and_conquer = [&](auto&& self, auto el,
20+
auto er, int tl, int tr) {
2121
adj.clear();
2222
int mid = midpoint(tl, tr);
23-
rep(i, el, er) {
24-
auto& [u, v] = eds[idx[i]];
25-
for (int w : {u, v})
26-
if (ids[w] == -1) {
27-
ids[w] = sz(adj);
28-
vs[sz(adj)] = w;
29-
adj.emplace_back();
30-
}
23+
for (auto it = el; it != er; it++) {
24+
auto& [u, v] = eds[*it];
25+
for (int w : {u, v}) {
26+
if (ids[w] != -1) continue;
27+
ids[w] = sz(adj);
28+
vs[sz(adj)] = w;
29+
adj.emplace_back();
30+
}
3131
u = ids[u], v = ids[v];
32-
if (idx[i] <= mid) adj[u].push_back(v);
32+
if (*it <= mid) adj[u].push_back(v);
3333
}
3434
rep(i, 0, sz(adj)) ids[vs[i]] = -1;
3535
scc_id = sccs(adj).scc_id;
36-
int split = partition(begin(idx) + el, begin(idx) + er, [&](int i) { return scc_id[eds[i][0]] == scc_id[eds[i][1]]; }) - begin(idx);
37-
rep(i, el, split) joins[idx[i]] = mid;
36+
auto split = partition(el, er, [&](int i) {
37+
return scc_id[eds[i][0]] == scc_id[eds[i][1]];
38+
});
39+
for (auto it = el; it != split; it++) joins[*it] = mid;
3840
if (tr - tl == 1) return;
39-
rep(i, split, er) {
40-
auto& [u, v] = eds[idx[i]];
41+
for (auto it = split; it != er; it++) {
42+
auto& [u, v] = eds[*it];
4143
u = scc_id[u], v = scc_id[v];
4244
}
4345
self(self, el, split, tl, mid);
4446
self(self, split, er, mid, tr);
4547
};
4648
// uses -1 as the lower bound to correctly handle
4749
// self-edges
48-
divide_and_conquer(divide_and_conquer, 0, m, -1, m);
50+
divide_and_conquer(divide_and_conquer, all(idx), -1, m);
4951
return joins;
5052
}

tests/library_checker_aizu_tests/graphs/offline_incremental_scc.test.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ int main() {
1313
vector<array<int, 2>> eds(m);
1414
for (auto& [u, v] : eds) cin >> u >> v;
1515
auto joins = offline_incremental_scc(eds, n);
16+
// assert joins[i] == -1 for self-edges
1617
for (int t = 0; t < m; t++)
1718
assert((eds[t][0] == eds[t][1]) == (joins[t] == -1));
1819
vector<int> order(m);

tests/library_checker_aizu_tests/math/xor_basis_intersection.test.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,10 @@ int main() {
1717
cin.tie(0)->sync_with_stdio(0);
1818
int t;
1919
cin >> t;
20-
basis<int> basis1, basis2;
2120
while (t--) {
2221
int n;
2322
cin >> n;
24-
basis1.b.clear();
23+
basis<int> basis1;
2524
for (int i = 0; i < n; i++) {
2625
int val;
2726
cin >> val;
@@ -30,7 +29,7 @@ int main() {
3029
check_condition(basis1);
3130
int m;
3231
cin >> m;
33-
basis2.b.clear();
32+
basis<int> basis2;
3433
for (int j = 0; j < m; j++) {
3534
int val;
3635
cin >> val;

0 commit comments

Comments
 (0)