summaryrefslogtreecommitdiff
path: root/content/graph/reroot.cpp
diff options
context:
space:
mode:
authorflorian <uwnte@student.kit.edu>2024-08-29 16:45:22 +0200
committerflorian <uwnte@student.kit.edu>2024-08-29 16:45:22 +0200
commit9cb227598ad234265b44ed5feb9890f5401f8e81 (patch)
treef752a22eb22b5c0fa4bfe129ccb3db12a92983b1 /content/graph/reroot.cpp
parent8bad460ff55d67bac81ae31196b05c1524a52e34 (diff)
spacing
Diffstat (limited to 'content/graph/reroot.cpp')
-rw-r--r--content/graph/reroot.cpp68
1 files changed, 34 insertions, 34 deletions
diff --git a/content/graph/reroot.cpp b/content/graph/reroot.cpp
index a413917..2ec9ad4 100644
--- a/content/graph/reroot.cpp
+++ b/content/graph/reroot.cpp
@@ -4,44 +4,44 @@
// output[r] = dp[r], where dp[v] :=
// fin(Sum_{child c of v, regarding root r} from_child( dp[c] ))
struct Reroot {
- using D = todo; // dp value
- using A = todo (often D); // value from a vertex's child(ren)
- // (A,agg,e) commutative monoid
+ 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 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 }
- vector<D> dp;
+ vector<D> dp;
- D dfs0(z v, z p, auto& g) {
- A ca = e;
- for(auto [c, w] : g[v]) if(c-p) {
- ca = agg(ca, from_child(v, c, w, dfs0(c, v, g)));
- }
- return dp[v] = fin(v, ca);
+ D dfs0(z v, z p, auto& g) {
+ A ca = e;
+ for (auto [c, w] : g[v]) if(c-p) {
+ ca = agg(ca, from_child(v, c, w, dfs0(c, v, g)));
}
- void dfs1(z v, z p, auto& g) {
- vector ps = {e};
- for(auto [c, w] : g[v]) {
- ps.push_back(from_child(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) {
- dp[v] = fin(v, agg(ss[i], ps[i]));
- dfs1(c, v, g);
- }
- dp[v] = fin(v, s[0]);
+ return dp[v] = fin(v, ca);
+ }
+ void dfs1(z v, z p, auto& g) {
+ vector ps = {e};
+ for (auto [c, w] : g[v]) {
+ ps.push_back(from_child(v, c, w, dp[c]));
}
-
- auto solve(auto g) {
- dp.resize(sz(g));
- dfs0(0, 0, g);
- dfs1(0, 0, g);
- return dp;
+ 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) {
+ dp[v] = fin(v, agg(ss[i], ps[i]));
+ dfs1(c, v, g);
}
+ dp[v] = fin(v, s[0]);
+ }
+
+ auto solve(auto g) {
+ dp.resize(sz(g));
+ dfs0(0, 0, g);
+ dfs1(0, 0, g);
+ return dp;
+ }
}; \ No newline at end of file