|
11 | 11 | //! t[v].childs = forest of reversed edges not in cycles |
12 | 12 | //! @time O(n) |
13 | 13 | //! @space O(n) |
14 | | -struct func_graph { |
15 | | - vector<pii> root_of; |
16 | | - vector<vi> cycle, childs; |
17 | | - func_graph(const vi& a): root_of(sz(a)), childs(sz(a)) { |
18 | | - vi vis(sz(a)); |
19 | | - rep(i, 0, sz(a)) if (!vis[i]) { |
20 | | - int u = i; |
21 | | - for (; !vis[u]; u = a[u]) vis[u] = 1; |
22 | | - if (vis[u] == 1) |
23 | | - for (cycle.emplace_back(); vis[u] == 1; u = a[u]) { |
24 | | - root_of[u] = {sz(cycle) - 1, sz(cycle.back())}; |
25 | | - cycle.back().push_back(u); |
26 | | - vis[u] = 2; |
27 | | - } |
28 | | - for (int v = i; vis[v] == 1; v = a[v]) { |
29 | | - root_of[v] = root_of[u]; |
30 | | - childs[a[v]].push_back(v); |
31 | | - vis[v] = 2; |
| 14 | +auto func_graph(const vi& a) { |
| 15 | + int n = sz(a); |
| 16 | + vector<pii> root_of(n); |
| 17 | + vector<vi> cycle, childs(n); |
| 18 | + vi vis(n); |
| 19 | + rep(i, 0, n) if (!vis[i]) { |
| 20 | + int u = i; |
| 21 | + for (; !vis[u]; u = a[u]) vis[u] = 1; |
| 22 | + if (vis[u] == 1) |
| 23 | + for (cycle.emplace_back(); vis[u] == 1; u = a[u]) { |
| 24 | + root_of[u] = {sz(cycle) - 1, sz(cycle.back())}; |
| 25 | + cycle.back().push_back(u); |
| 26 | + vis[u] = 2; |
32 | 27 | } |
| 28 | + for (int v = i; vis[v] == 1; v = a[v]) { |
| 29 | + root_of[v] = root_of[u]; |
| 30 | + childs[a[v]].push_back(v); |
| 31 | + vis[v] = 2; |
33 | 32 | } |
34 | 33 | } |
35 | | -}; |
| 34 | + return tuple{root_of, cycle, childs}; |
| 35 | +} |
0 commit comments