diff options
| author | florian <uwnte@student.kit.edu> | 2024-08-29 17:25:34 +0200 |
|---|---|---|
| committer | florian <uwnte@student.kit.edu> | 2024-08-29 17:25:34 +0200 |
| commit | 3328e0fd09ce1cca46ade4a492edff92a3edb8ac (patch) | |
| tree | f8fdc0aa1a91cf3b6c517db41c47b39eacab6195 /content/graph/reroot.cpp | |
| parent | 7c766d23e88ec6c83306bee379f1bfbcdbe48813 (diff) | |
code style
Diffstat (limited to 'content/graph/reroot.cpp')
| -rw-r--r-- | content/graph/reroot.cpp | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/content/graph/reroot.cpp b/content/graph/reroot.cpp index 59fea94..6c9551e 100644 --- a/content/graph/reroot.cpp +++ b/content/graph/reroot.cpp @@ -1,47 +1,51 @@ -// input: undirected (un)weighted tree as -// adjacency list containing pair<neighbour,weight>s -// (To remove weights, remove every "w" and fix errors) // output[r] = dp[r], where dp[v] := -// fin(Sum_{child c of v, regarding root r} from_child( dp[c] )) +// fin(Sum_{child c of v, regarding root r} fromChild( dp[c] )) + +// To remove weights, remove every "w" and "W" and fix errors struct Reroot { - using D = todo; // dp value - using A = todo (often D); // value from a vertex's child(ren) + using D = /todo/; // dp value + using A = /todo/ (often D); // value from a vertex's child(ren) // (A,agg,e) commutative monoid - A e = todo; - A from_child(z v, z c, auto w, D dp_c) { todo } - static A agg(A a, A b) { todo } - D fin(z v, A chils_agg) { todo } + A e = /todo/; + A fromChild(int v, int c, auto w, D dp_c) { /todo/ } + static A agg(A a, A b) { /todo/ } + D fin(int v, A chilsAgg) { /todo/ } vector<D> dp; - D dfs0(z v, z p, auto& g) { + D dfs0(auto& g, int v, int from = -1) { A ca = e; - for (auto [c, w] : g[v]) if(c-p) { - ca = agg(ca, from_child(v, c, w, dfs0(c, v, g))); + for (auto [c, w] : g[v]) { + if (c == from) continue; + ca = agg(ca, fromChild(v, c, w, dfs0(c, v, g))); } return dp[v] = fin(v, ca); } - void dfs1(z v, z p, auto& g) { + + void dfs1(auto& g, int v, int from = -1) { vector ps = {e}; for (auto [c, w] : g[v]) { - ps.push_back(from_child(v, c, w, dp[c])); + ps.push_back(fromChild(v, c, w, dp[c])); } auto ss = ps; exclusive_scan(ps.begin(), ps.end(), ps.begin(), e, agg); exclusive_scan(ss.rbegin(),ss.rend(),ss.rbegin(),e, agg); - z i = 0; - for (auto [c, w] : g[v]) if(++i, c-p) { + int i = 0; + for (auto [c, w] : g[v]) { + ++i; + if (c == from) continue; dp[v] = fin(v, agg(ss[i], ps[i])); dfs1(c, v, g); } dp[v] = fin(v, ss[0]); } - auto solve(auto g) { + template<typename W> + auto solve(vector<vector<pair<int, W>>> g) { dp.resize(sz(g)); - dfs0(0, 0, g); - dfs1(0, 0, g); + dfs0(g, 0); + dfs1(g, 0); return dp; } };
\ No newline at end of file |
