summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorflorian <uwnte@student.kit.edu>2024-08-29 17:25:34 +0200
committerflorian <uwnte@student.kit.edu>2024-08-29 17:25:34 +0200
commit3328e0fd09ce1cca46ade4a492edff92a3edb8ac (patch)
treef8fdc0aa1a91cf3b6c517db41c47b39eacab6195
parent7c766d23e88ec6c83306bee379f1bfbcdbe48813 (diff)
code style
-rw-r--r--content/graph/reroot.cpp44
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