From f833cc76d7060382c8d0c373a118b7ba5d55cf3f Mon Sep 17 00:00:00 2001 From: enwask Date: Wed, 5 Nov 2025 15:50:48 -0500 Subject: [PATCH 1/4] Add generic reroot --- content/graphs/Reroot.h | 37 +++++++++++++++++++++++++++++++++++++ content/graphs/chapter.tex | 1 + 2 files changed, 38 insertions(+) create mode 100644 content/graphs/Reroot.h diff --git a/content/graphs/Reroot.h b/content/graphs/Reroot.h new file mode 100644 index 000000000..9d6ba08c8 --- /dev/null +++ b/content/graphs/Reroot.h @@ -0,0 +1,37 @@ +/** + * Author: Nic Washbourne + * Date: 2025-09-26 + * Source: Sachin Sivakumar + * Description: Generic reroot DP with decombine. The provided operations solve sum of distances to all nodes. + * Time: O(N) + * Status: Tested on CSES: Tree Distances II + */ +#pragma once + +using T = pair; +T init() { return {1, 0}; } +T combine(T a, T b) { return {a.first + b.first, a.second + b.second + b.first}; } +T decombine(T a, T b) { return {a.first - b.first, a.second - b.second - b.first}; } + +vector adj; +vector dp, dpr; + +T dfs(int u, int p) { + dp[u] = init(); + for (int v: adj[u]) { + if (v == p) continue; + dp[u] = combine(dp[u], dfs(v, u)); + } + return dp[u]; +} + +T dfsr(int u, int p, T dpr_p = init()) { + dpr[u] = dp[u]; + if (p != u) dpr[u] = combine(dpr[u], dpr_p); + for (int v: adj[u]) { + if (v == p) continue; + T dec = decombine(dpr[u], dp[v]); + dfsr(v, u, dec); + } + return dpr[u]; +} diff --git a/content/graphs/chapter.tex b/content/graphs/chapter.tex index 72815a718..db4a53742 100644 --- a/content/graphs/chapter.tex +++ b/content/graphs/chapter.tex @@ -29,6 +29,7 @@ \section{DFS algorithms} \kactlimport{2sat.h} \kactlimport{EulerWalk.h} \kactlimport{DominatorTree.h} + \kactlimport{Reroot.h} \section{Coloring} \kactlimport{EdgeColoring.h} From b8368d4266b737114cfa9bcea5e77345c6f65ab4 Mon Sep 17 00:00:00 2001 From: enwask Date: Wed, 5 Nov 2025 15:55:15 -0500 Subject: [PATCH 2/4] Use tabs for indent --- content/graphs/Reroot.h | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/content/graphs/Reroot.h b/content/graphs/Reroot.h index 9d6ba08c8..95a48ea97 100644 --- a/content/graphs/Reroot.h +++ b/content/graphs/Reroot.h @@ -17,21 +17,21 @@ vector adj; vector dp, dpr; T dfs(int u, int p) { - dp[u] = init(); - for (int v: adj[u]) { - if (v == p) continue; - dp[u] = combine(dp[u], dfs(v, u)); - } - return dp[u]; + dp[u] = init(); + for (int v : adj[u]) { + if (v == p) continue; + dp[u] = combine(dp[u], dfs(v, u)); + } + return dp[u]; } T dfsr(int u, int p, T dpr_p = init()) { - dpr[u] = dp[u]; - if (p != u) dpr[u] = combine(dpr[u], dpr_p); - for (int v: adj[u]) { - if (v == p) continue; - T dec = decombine(dpr[u], dp[v]); - dfsr(v, u, dec); - } - return dpr[u]; + dpr[u] = dp[u]; + if (p != u) dpr[u] = combine(dpr[u], dpr_p); + for (int v : adj[u]) { + if (v == p) continue; + T dec = decombine(dpr[u], dp[v]); + dfsr(v, u, dec); + } + return dpr[u]; } From 9a8f72a3b322c594d30bc6923bf462942cfa7931 Mon Sep 17 00:00:00 2001 From: enwask Date: Wed, 5 Nov 2025 15:56:25 -0500 Subject: [PATCH 3/4] Fix max line length --- content/graphs/Reroot.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/content/graphs/Reroot.h b/content/graphs/Reroot.h index 95a48ea97..1f61bd2c3 100644 --- a/content/graphs/Reroot.h +++ b/content/graphs/Reroot.h @@ -10,8 +10,10 @@ using T = pair; T init() { return {1, 0}; } -T combine(T a, T b) { return {a.first + b.first, a.second + b.second + b.first}; } -T decombine(T a, T b) { return {a.first - b.first, a.second - b.second - b.first}; } +T combine(T a, T b) { return {a.first + b.first, + a.second + b.second + b.first}; } +T decombine(T a, T b) { return {a.first - b.first, + a.second - b.second - b.first}; } vector adj; vector dp, dpr; From be8fa6b2cc013e0d5122bf32787646d895e09185 Mon Sep 17 00:00:00 2001 From: enwask Date: Wed, 5 Nov 2025 16:03:34 -0500 Subject: [PATCH 4/4] Reroot codegolf --- content/graphs/Reroot.h | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/content/graphs/Reroot.h b/content/graphs/Reroot.h index 1f61bd2c3..509262faa 100644 --- a/content/graphs/Reroot.h +++ b/content/graphs/Reroot.h @@ -20,20 +20,15 @@ vector dp, dpr; T dfs(int u, int p) { dp[u] = init(); - for (int v : adj[u]) { - if (v == p) continue; + for (int v : adj[u]) if (v != p) dp[u] = combine(dp[u], dfs(v, u)); - } return dp[u]; } T dfsr(int u, int p, T dpr_p = init()) { dpr[u] = dp[u]; if (p != u) dpr[u] = combine(dpr[u], dpr_p); - for (int v : adj[u]) { - if (v == p) continue; - T dec = decombine(dpr[u], dp[v]); - dfsr(v, u, dec); - } + for (int v : adj[u]) if (v != p) + dfsr(v, u, decombine(dpr[u], dp[v])); return dpr[u]; }