Skip to content

Commit 39252b1

Browse files
authored
swap u and v in dfs (#164)
1 parent 97e9b4b commit 39252b1

19 files changed

+207
-208
lines changed

library/graphs/bcc_callback.hpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,31 +9,31 @@
99
//! int count_edges = 0;
1010
//! rep (i, 0, sz(nodes) - 1) {
1111
//! seen[nodes[i]] = 1;
12-
//! for (int v : adj[nodes[i]]) if (!seen[v]) {
13-
//! // edge nodes[i] <=> v is in current BCC
12+
//! for (int u : adj[nodes[i]]) if (!seen[u]) {
13+
//! // edge nodes[i] <=> u is in current BCC
1414
//! count_edges++;
1515
//! }
1616
//! }
1717
//! if (count_edges == 1) {
1818
//! // nodes[0] <=> nodes[1] is a bridge
1919
//! return;
2020
//! }
21-
//! for (int v : nodes) uf.join(v, nodes[0]);
21+
//! for (int u : nodes) uf.join(u, nodes[0]);
2222
//! });
2323
//! vector<basic_string<int>> bridge_tree(n);
2424
//! rep (i, 0, n)
25-
//! for (int v : adj[i])
26-
//! if (!uf.sameSet(i, v))
27-
//! bridge_tree[uf.find(i)] += uf.find(v);
25+
//! for (int u : adj[i])
26+
//! if (!uf.sameSet(i, u))
27+
//! bridge_tree[uf.find(i)] += uf.find(u);
2828
//! }
2929
//!
3030
//! vector<basic_string<int>> adj(n);
3131
//! vector<basic_string<int>> block_vertex_tree(2 * n);
3232
//! int bcc_id = n;
3333
//! bcc_callback(adj, [&](const vi& nodes) {
34-
//! for (int v : nodes) {
35-
//! block_vertex_tree[v] += bcc_id;
36-
//! block_vertex_tree[bcc_id] += v;
34+
//! for (int u : nodes) {
35+
//! block_vertex_tree[u] += bcc_id;
36+
//! block_vertex_tree[bcc_id] += u;
3737
//! }
3838
//! bcc_id++;
3939
//! });
@@ -44,13 +44,13 @@
4444
void bcc_callback(const auto& adj, auto f) {
4545
int n = sz(adj), q = 0, s = 0;
4646
vi t(n), st(n);
47-
auto dfs = [&](auto&& self, int v) -> int {
48-
int l = t[v] = ++q;
49-
for (int u : adj[v]) {
47+
auto dfs = [&](auto&& self, int u) -> int {
48+
int l = t[u] = ++q;
49+
for (int v : adj[u]) {
5050
int siz = s, lu = 0;
51-
l = min(l, t[u] ?: (lu = self(self, st[s++] = u)));
52-
if (lu >= t[v]) {
53-
st[s++] = v;
51+
l = min(l, t[v] ?: (lu = self(self, st[s++] = v)));
52+
if (lu >= t[u]) {
53+
st[s++] = u;
5454
f({siz + all(st) - n + s});
5555
s = siz;
5656
}

library/graphs/hopcroft_karp.hpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,31 +29,31 @@ struct hopcroft_karp {
2929
mvc_l.assign(lsz, 1);
3030
mvc_r.assign(rsz, 0);
3131
while (!empty(q)) {
32-
int v = q.front();
32+
int u = q.front();
3333
q.pop();
34-
mvc_l[v] = 0;
35-
for (int u : adj[v]) {
36-
mvc_r[u] = 1;
37-
int w = to_l[u];
34+
mvc_l[u] = 0;
35+
for (int v : adj[u]) {
36+
mvc_r[v] = 1;
37+
int w = to_l[v];
3838
if (w == -1) found = 1;
3939
else if (level[w] == -1) {
40-
level[w] = level[v] + 1;
40+
level[w] = level[u] + 1;
4141
q.push(w);
4242
}
4343
}
4444
}
4545
if (!found) break;
46-
auto dfs = [&](auto&& self, int v) -> bool {
47-
for (int u : adj[v]) {
48-
int w = to_l[u];
46+
auto dfs = [&](auto&& self, int u) -> bool {
47+
for (int v : adj[u]) {
48+
int w = to_l[v];
4949
if (w == -1 ||
50-
(level[v] + 1 == level[w] && self(self, w))) {
51-
to_r[v] = u;
52-
to_l[u] = v;
50+
(level[u] + 1 == level[w] && self(self, w))) {
51+
to_r[u] = v;
52+
to_l[v] = u;
5353
return 1;
5454
}
5555
}
56-
level[v] = INT_MAX;
56+
level[u] = INT_MAX;
5757
return 0;
5858
};
5959
rep(i, 0, lsz) m_sz +=

library/graphs/scc.hpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,21 @@
44
//! vector<basic_string<int>> adj(n);
55
//! auto [num_sccs, scc_id] = sccs(adj);
66
//! @endcode
7-
//! scc_id[v] = id, 0<=id<num_sccs
7+
//! scc_id[u] = id, 0<=id<num_sccs
88
//! for each edge u -> v: scc_id[u] >= scc_id[v]
99
//! @time O(n + m)
1010
//! @space O(n)
1111
auto sccs(const auto& adj) {
1212
int n = sz(adj), num_sccs = 0, q = 0, s = 0;
1313
vi scc_id(n, -1), tin(n), st(n);
14-
auto dfs = [&](auto&& self, int v) -> int {
15-
int low = tin[v] = ++q;
16-
st[s++] = v;
17-
for (int u : adj[v])
18-
if (scc_id[u] < 0)
19-
low = min(low, tin[u] ?: self(self, u));
20-
if (tin[v] == low) {
21-
while (scc_id[v] < 0) scc_id[st[--s]] = num_sccs;
14+
auto dfs = [&](auto&& self, int u) -> int {
15+
int low = tin[u] = ++q;
16+
st[s++] = u;
17+
for (int v : adj[u])
18+
if (scc_id[v] < 0)
19+
low = min(low, tin[v] ?: self(self, v));
20+
if (tin[u] == low) {
21+
while (scc_id[u] < 0) scc_id[st[--s]] = num_sccs;
2222
num_sccs++;
2323
}
2424
return low;

library/graphs/strongly_connected_components/add_edges_strongly_connected.hpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,18 @@ vector<pii> extra_edges(const auto& adj, int num_sccs,
2323
int n = sz(adj);
2424
vector<vi> scc_adj(num_sccs);
2525
vector<bool> zero_in(num_sccs, 1);
26-
rep(i, 0, n) for (int u : adj[i]) {
27-
if (scc_id[i] == scc_id[u]) continue;
28-
scc_adj[scc_id[i]].push_back(scc_id[u]);
29-
zero_in[scc_id[u]] = 0;
26+
rep(i, 0, n) for (int v : adj[i]) {
27+
if (scc_id[i] == scc_id[v]) continue;
28+
scc_adj[scc_id[i]].push_back(scc_id[v]);
29+
zero_in[scc_id[v]] = 0;
3030
}
3131
vector<bool> vis(num_sccs);
32-
auto dfs = [&](auto&& self, int v) {
33-
if (empty(scc_adj[v])) return v;
34-
for (int u : scc_adj[v])
35-
if (!vis[u]) {
36-
vis[u] = 1;
37-
int zero_out = self(self, u);
32+
auto dfs = [&](auto&& self, int u) {
33+
if (empty(scc_adj[u])) return u;
34+
for (int v : scc_adj[u])
35+
if (!vis[v]) {
36+
vis[v] = 1;
37+
int zero_out = self(self, v);
3838
if (zero_out != -1) return zero_out;
3939
}
4040
return -1;
@@ -55,7 +55,7 @@ vector<pii> extra_edges(const auto& adj, int num_sccs,
5555
in_unused.pop_back();
5656
} else edges.emplace_back(i, num_sccs - 1);
5757
}
58-
for (int v : in_unused) edges.emplace_back(0, v);
58+
for (int u : in_unused) edges.emplace_back(0, u);
5959
vi to_node(num_sccs);
6060
rep(i, 0, n) to_node[scc_id[i]] = i;
6161
for (auto& [u, v] : edges)

library/graphs/uncommon/bridges.hpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@
1818
auto bridges(const auto& adj, int m) {
1919
int n = sz(adj), num_ccs = 0, q = 0, s = 0;
2020
vi br_id(n, -1), is_br(m), tin(n), st(n);
21-
auto dfs = [&](auto&& self, int v, int p) -> int {
22-
int low = tin[v] = ++q;
23-
st[s++] = v;
24-
for (auto [u, e] : adj[v])
25-
if (e != p && br_id[u] < 0)
26-
low = min(low, tin[u] ?: self(self, u, e));
27-
if (tin[v] == low) {
21+
auto dfs = [&](auto&& self, int u, int p) -> int {
22+
int low = tin[u] = ++q;
23+
st[s++] = u;
24+
for (auto [v, e] : adj[u])
25+
if (e != p && br_id[v] < 0)
26+
low = min(low, tin[v] ?: self(self, v, e));
27+
if (tin[u] == low) {
2828
if (p != -1) is_br[p] = 1;
29-
while (br_id[v] < 0) br_id[st[--s]] = num_ccs;
29+
while (br_id[u] < 0) br_id[st[--s]] = num_ccs;
3030
num_ccs++;
3131
}
3232
return low;

library/graphs/uncommon/cuts.hpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@
1919
auto cuts(const auto& adj, int m) {
2020
int n = sz(adj), num_bccs = 0, q = 0, s = 0;
2121
vi bcc_id(m, -1), is_cut(n), tin(n), st(m);
22-
auto dfs = [&](auto&& self, int v, int p) -> int {
23-
int low = tin[v] = ++q;
24-
for (auto [u, e] : adj[v]) {
25-
assert(v != u);
22+
auto dfs = [&](auto&& self, int u, int p) -> int {
23+
int low = tin[u] = ++q;
24+
for (auto [v, e] : adj[u]) {
25+
assert(u != v);
2626
if (e == p) continue;
27-
if (tin[u] < tin[v]) st[s++] = e;
27+
if (tin[v] < tin[u]) st[s++] = e;
2828
int lu = -1;
29-
low = min(low, tin[u] ?: (lu = self(self, u, e)));
30-
if (lu >= tin[v]) {
31-
is_cut[v] = p >= 0 || tin[v] + 1 < tin[u];
29+
low = min(low, tin[v] ?: (lu = self(self, v, e)));
30+
if (lu >= tin[u]) {
31+
is_cut[u] = p >= 0 || tin[u] + 1 < tin[v];
3232
while (bcc_id[e] < 0) bcc_id[st[--s]] = num_bccs;
3333
num_bccs++;
3434
}

library/trees/hld.hpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
//! HLD<0> hld(adj);
66
//! hld.path(u, v, [&](int l, int r) { // [l, r)
77
//! });
8-
//! auto [l, r] = hld.subtree(v); // [l, r)
8+
//! auto [l, r] = hld.subtree(u); // [l, r)
99
//! @endcode
1010
//! @time O(n + q log^2 n)
1111
//! @space O(n)
@@ -15,23 +15,23 @@ template<bool VALS_EDGES> struct HLD {
1515
vi p, siz, rt, tin;
1616
HLD(auto& adj):
1717
n(sz(adj)), p(n), siz(n, 1), rt(n), tin(n) {
18-
auto dfs1 = [&](auto&& self, int v) -> void {
19-
for (int& u : adj[v]) {
20-
iter_swap(ranges::find(adj[u], v), rbegin(adj[u]));
21-
adj[u].pop_back();
22-
p[u] = v;
23-
self(self, u);
24-
siz[v] += siz[u];
25-
if (siz[u] > siz[adj[v][0]]) swap(u, adj[v][0]);
18+
auto dfs1 = [&](auto&& self, int u) -> void {
19+
for (int& v : adj[u]) {
20+
iter_swap(ranges::find(adj[v], u), rbegin(adj[v]));
21+
adj[v].pop_back();
22+
p[v] = u;
23+
self(self, v);
24+
siz[u] += siz[v];
25+
if (siz[v] > siz[adj[u][0]]) swap(v, adj[u][0]);
2626
}
2727
};
2828
dfs1(dfs1, 0);
2929
int tim = 0;
30-
auto dfs2 = [&](auto&& self, int v) -> void {
31-
tin[v] = tim++;
32-
for (int u : adj[v]) {
33-
rt[u] = (u == adj[v][0] ? rt[v] : u);
34-
self(self, u);
30+
auto dfs2 = [&](auto&& self, int u) -> void {
31+
tin[u] = tim++;
32+
for (int v : adj[u]) {
33+
rt[v] = (v == adj[u][0] ? rt[u] : v);
34+
self(self, v);
3535
}
3636
};
3737
dfs2(dfs2, 0);
@@ -44,7 +44,7 @@ template<bool VALS_EDGES> struct HLD {
4444
}
4545
f(tin[u] + VALS_EDGES, tin[v] + 1);
4646
}
47-
pii subtree(int v) {
48-
return {tin[v] + VALS_EDGES, tin[v] + siz[v]};
47+
pii subtree(int u) {
48+
return {tin[u] + VALS_EDGES, tin[u] + siz[u]};
4949
}
5050
};

library/trees/lca_rmq.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ struct LCA {
1616
LCA(const auto& adj):
1717
n(sz(adj)), tin(n), siz(n, 1), d(n), p(n) {
1818
vi order;
19-
auto dfs = [&](auto&& self, int v) -> void {
20-
tin[v] = sz(order), order.push_back(v);
21-
for (int u : adj[v])
22-
if (u != p[v])
23-
d[u] = d[p[u] = v] + 1, self(self, u),
24-
siz[v] += siz[u];
19+
auto dfs = [&](auto&& self, int u) -> void {
20+
tin[u] = sz(order), order.push_back(u);
21+
for (int v : adj[u])
22+
if (v != p[u])
23+
d[v] = d[p[v] = u] + 1, self(self, v),
24+
siz[u] += siz[v];
2525
};
2626
dfs(dfs, 0);
2727
rmq = {order,

library/trees/linear_kth_par.hpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,28 +21,28 @@ template<int KAPPA = 2> struct linear_kth_par {
2121
jmp[t] = st[max(0, s - KAPPA * (t & -t))];
2222
t++;
2323
};
24-
auto dfs = [&](auto&& self, int v, int p) -> void {
25-
int& l = leaf[v] = st[d[v]] = v;
26-
pos[v] = t;
27-
calc(d[v]);
28-
for (int u : adj[v])
29-
if (u != p) {
30-
d[u] = 1 + d[v];
31-
self(self, u, v);
32-
if (d[l] < d[leaf[u]]) l = leaf[u];
33-
calc(d[v]);
24+
auto dfs = [&](auto&& self, int u, int p) -> void {
25+
int& l = leaf[u] = st[d[u]] = u;
26+
pos[u] = t;
27+
calc(d[u]);
28+
for (int v : adj[u])
29+
if (v != p) {
30+
d[v] = 1 + d[u];
31+
self(self, v, u);
32+
if (d[l] < d[leaf[v]]) l = leaf[v];
33+
calc(d[u]);
3434
}
35-
int s = (d[l] - d[v]) * (2 * KAPPA + 3) / KAPPA;
35+
int s = (d[l] - d[u]) * (2 * KAPPA + 3) / KAPPA;
3636
s = min(max(s, 2 * KAPPA), d[l] + 1);
3737
rep(i, sz(lad[l]), s) lad[l].push_back(st[d[l] - i]);
3838
};
3939
dfs(dfs, 0, 0);
4040
}
41-
int kth_par(int v, int k) {
42-
assert(0 <= k && k <= d[v]);
43-
int anc_d = d[v] - k;
41+
int kth_par(int u, int k) {
42+
assert(0 <= k && k <= d[u]);
43+
int anc_d = d[u] - k;
4444
if (unsigned j = k / (KAPPA + 1); j)
45-
j = bit_floor(j), v = jmp[(pos[v] & -j) | j];
46-
return v = leaf[v], lad[v][d[v] - anc_d];
45+
j = bit_floor(j), u = jmp[(pos[u] & -j) | j];
46+
return u = leaf[u], lad[u][d[u] - anc_d];
4747
}
4848
};

library/trees/linear_lca.hpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,19 @@ struct linear_lca {
1313
linear_lca(const auto& adj):
1414
n(sz(adj)), d(n), in(n), asc(n), head(n + 1) {
1515
vector<pii> order;
16-
auto dfs = [&](auto&& self, int v, int p) -> void {
17-
order.emplace_back(v, p);
18-
in[v] = sz(order);
19-
for (int u : adj[v])
20-
if (u != p) {
21-
d[u] = 1 + d[v];
22-
self(self, u, v);
23-
head[in[u]] = v;
24-
if (lsb(in[v]) < lsb(in[u])) in[v] = in[u];
16+
auto dfs = [&](auto&& self, int u, int p) -> void {
17+
order.emplace_back(u, p);
18+
in[u] = sz(order);
19+
for (int v : adj[u])
20+
if (v != p) {
21+
d[v] = 1 + d[u];
22+
self(self, v, u);
23+
head[in[v]] = u;
24+
if (lsb(in[u]) < lsb(in[v])) in[u] = in[v];
2525
}
2626
};
2727
dfs(dfs, 0, 0);
28-
for (auto [v, p] : order) asc[v] = asc[p] | lsb(in[v]);
28+
for (auto [u, p] : order) asc[u] = asc[p] | lsb(in[u]);
2929
}
3030
int lca(int u, int v) {
3131
if (unsigned j = in[u] ^ in[v]; j) {

0 commit comments

Comments
 (0)