pub struct ReRooting<'a, M: Monoid, F: Fn(&M::T, usize, Option<usize>) -> M::T> {
graph: &'a UndirectedSparseGraph,
pub dp: Vec<M::T>,
pub ep: Vec<M::T>,
rooting: F,
}Expand description
dynamic programming on all-rooted trees
caluculate all subtrees (hanging on the edge) in specific ordering, each subtree calculated in the order of merge and rooting
Fields§
§graph: &'a UndirectedSparseGraph§dp: Vec<M::T>dp[v]: result of v-rooted tree
ep: Vec<M::T>ep[e]: result of e-subtree, if e >= n then reversed-e-subtree
rooting: Frooting(data, vid, (Optional)eid): add root node(vid), result subtree is edge(eid)
Implementations§
Source§impl<'a, M, F> ReRooting<'a, M, F>
impl<'a, M, F> ReRooting<'a, M, F>
Sourcepub fn new(graph: &'a UndirectedSparseGraph, rooting: F) -> Self
pub fn new(graph: &'a UndirectedSparseGraph, rooting: F) -> Self
Sourcefn eidx(&self, u: usize, a: &Adjacency) -> usize
fn eidx(&self, u: usize, a: &Adjacency) -> usize
Examples found in repository?
crates/competitive/src/tree/rerooting.rs (line 61)
59 fn dfs(&mut self, pa: &Adjacency, p: usize) {
60 let u = pa.to;
61 let pi = self.eidx(p, pa);
62 for a in self.graph.adjacencies(u).filter(|a| a.to != p) {
63 let i = self.eidx(u, a);
64 self.dfs(a, u);
65 self.ep[pi] = self.merge(&self.ep[pi], &self.ep[i]);
66 }
67 self.ep[pi] = self.add_subroot(&self.ep[pi], u, pa.id);
68 }
69 fn efs(&mut self, u: usize, p: usize) {
70 let m = self.graph.adjacencies(u).len();
71 let mut left = vec![M::unit(); m + 1];
72 let mut right = vec![M::unit(); m + 1];
73 for (k, a) in self.graph.adjacencies(u).enumerate() {
74 let i = self.eidx(u, a);
75 left[k + 1] = self.merge(&left[k], &self.ep[i]);
76 }
77 for (k, a) in self.graph.adjacencies(u).enumerate().rev() {
78 let i = self.eidx(u, a);
79 right[k] = self.merge(&right[k + 1], &self.ep[i]);
80 }
81 self.dp[u] = self.add_root(&left[m], u);
82 for (k, a) in self.graph.adjacencies(u).enumerate() {
83 if a.to != p {
84 let i = self.reidx(u, a);
85 self.ep[i] = self.merge(&left[k], &right[k + 1]);
86 self.ep[i] = self.add_subroot(&self.ep[i], u, a.id);
87 self.efs(a.to, u);
88 }
89 }
90 }Sourcefn reidx(&self, u: usize, a: &Adjacency) -> usize
fn reidx(&self, u: usize, a: &Adjacency) -> usize
Examples found in repository?
crates/competitive/src/tree/rerooting.rs (line 84)
69 fn efs(&mut self, u: usize, p: usize) {
70 let m = self.graph.adjacencies(u).len();
71 let mut left = vec![M::unit(); m + 1];
72 let mut right = vec![M::unit(); m + 1];
73 for (k, a) in self.graph.adjacencies(u).enumerate() {
74 let i = self.eidx(u, a);
75 left[k + 1] = self.merge(&left[k], &self.ep[i]);
76 }
77 for (k, a) in self.graph.adjacencies(u).enumerate().rev() {
78 let i = self.eidx(u, a);
79 right[k] = self.merge(&right[k + 1], &self.ep[i]);
80 }
81 self.dp[u] = self.add_root(&left[m], u);
82 for (k, a) in self.graph.adjacencies(u).enumerate() {
83 if a.to != p {
84 let i = self.reidx(u, a);
85 self.ep[i] = self.merge(&left[k], &right[k + 1]);
86 self.ep[i] = self.add_subroot(&self.ep[i], u, a.id);
87 self.efs(a.to, u);
88 }
89 }
90 }Sourcefn merge(&self, x: &M::T, y: &M::T) -> M::T
fn merge(&self, x: &M::T, y: &M::T) -> M::T
Examples found in repository?
crates/competitive/src/tree/rerooting.rs (line 65)
59 fn dfs(&mut self, pa: &Adjacency, p: usize) {
60 let u = pa.to;
61 let pi = self.eidx(p, pa);
62 for a in self.graph.adjacencies(u).filter(|a| a.to != p) {
63 let i = self.eidx(u, a);
64 self.dfs(a, u);
65 self.ep[pi] = self.merge(&self.ep[pi], &self.ep[i]);
66 }
67 self.ep[pi] = self.add_subroot(&self.ep[pi], u, pa.id);
68 }
69 fn efs(&mut self, u: usize, p: usize) {
70 let m = self.graph.adjacencies(u).len();
71 let mut left = vec![M::unit(); m + 1];
72 let mut right = vec![M::unit(); m + 1];
73 for (k, a) in self.graph.adjacencies(u).enumerate() {
74 let i = self.eidx(u, a);
75 left[k + 1] = self.merge(&left[k], &self.ep[i]);
76 }
77 for (k, a) in self.graph.adjacencies(u).enumerate().rev() {
78 let i = self.eidx(u, a);
79 right[k] = self.merge(&right[k + 1], &self.ep[i]);
80 }
81 self.dp[u] = self.add_root(&left[m], u);
82 for (k, a) in self.graph.adjacencies(u).enumerate() {
83 if a.to != p {
84 let i = self.reidx(u, a);
85 self.ep[i] = self.merge(&left[k], &right[k + 1]);
86 self.ep[i] = self.add_subroot(&self.ep[i], u, a.id);
87 self.efs(a.to, u);
88 }
89 }
90 }Sourcefn add_subroot(&self, x: &M::T, vid: usize, eid: usize) -> M::T
fn add_subroot(&self, x: &M::T, vid: usize, eid: usize) -> M::T
Examples found in repository?
crates/competitive/src/tree/rerooting.rs (line 67)
59 fn dfs(&mut self, pa: &Adjacency, p: usize) {
60 let u = pa.to;
61 let pi = self.eidx(p, pa);
62 for a in self.graph.adjacencies(u).filter(|a| a.to != p) {
63 let i = self.eidx(u, a);
64 self.dfs(a, u);
65 self.ep[pi] = self.merge(&self.ep[pi], &self.ep[i]);
66 }
67 self.ep[pi] = self.add_subroot(&self.ep[pi], u, pa.id);
68 }
69 fn efs(&mut self, u: usize, p: usize) {
70 let m = self.graph.adjacencies(u).len();
71 let mut left = vec![M::unit(); m + 1];
72 let mut right = vec![M::unit(); m + 1];
73 for (k, a) in self.graph.adjacencies(u).enumerate() {
74 let i = self.eidx(u, a);
75 left[k + 1] = self.merge(&left[k], &self.ep[i]);
76 }
77 for (k, a) in self.graph.adjacencies(u).enumerate().rev() {
78 let i = self.eidx(u, a);
79 right[k] = self.merge(&right[k + 1], &self.ep[i]);
80 }
81 self.dp[u] = self.add_root(&left[m], u);
82 for (k, a) in self.graph.adjacencies(u).enumerate() {
83 if a.to != p {
84 let i = self.reidx(u, a);
85 self.ep[i] = self.merge(&left[k], &right[k + 1]);
86 self.ep[i] = self.add_subroot(&self.ep[i], u, a.id);
87 self.efs(a.to, u);
88 }
89 }
90 }Sourcefn add_root(&self, x: &M::T, vid: usize) -> M::T
fn add_root(&self, x: &M::T, vid: usize) -> M::T
Examples found in repository?
crates/competitive/src/tree/rerooting.rs (line 81)
69 fn efs(&mut self, u: usize, p: usize) {
70 let m = self.graph.adjacencies(u).len();
71 let mut left = vec![M::unit(); m + 1];
72 let mut right = vec![M::unit(); m + 1];
73 for (k, a) in self.graph.adjacencies(u).enumerate() {
74 let i = self.eidx(u, a);
75 left[k + 1] = self.merge(&left[k], &self.ep[i]);
76 }
77 for (k, a) in self.graph.adjacencies(u).enumerate().rev() {
78 let i = self.eidx(u, a);
79 right[k] = self.merge(&right[k + 1], &self.ep[i]);
80 }
81 self.dp[u] = self.add_root(&left[m], u);
82 for (k, a) in self.graph.adjacencies(u).enumerate() {
83 if a.to != p {
84 let i = self.reidx(u, a);
85 self.ep[i] = self.merge(&left[k], &right[k + 1]);
86 self.ep[i] = self.add_subroot(&self.ep[i], u, a.id);
87 self.efs(a.to, u);
88 }
89 }
90 }Sourcefn dfs(&mut self, pa: &Adjacency, p: usize)
fn dfs(&mut self, pa: &Adjacency, p: usize)
Examples found in repository?
crates/competitive/src/tree/rerooting.rs (line 64)
59 fn dfs(&mut self, pa: &Adjacency, p: usize) {
60 let u = pa.to;
61 let pi = self.eidx(p, pa);
62 for a in self.graph.adjacencies(u).filter(|a| a.to != p) {
63 let i = self.eidx(u, a);
64 self.dfs(a, u);
65 self.ep[pi] = self.merge(&self.ep[pi], &self.ep[i]);
66 }
67 self.ep[pi] = self.add_subroot(&self.ep[pi], u, pa.id);
68 }
69 fn efs(&mut self, u: usize, p: usize) {
70 let m = self.graph.adjacencies(u).len();
71 let mut left = vec![M::unit(); m + 1];
72 let mut right = vec![M::unit(); m + 1];
73 for (k, a) in self.graph.adjacencies(u).enumerate() {
74 let i = self.eidx(u, a);
75 left[k + 1] = self.merge(&left[k], &self.ep[i]);
76 }
77 for (k, a) in self.graph.adjacencies(u).enumerate().rev() {
78 let i = self.eidx(u, a);
79 right[k] = self.merge(&right[k + 1], &self.ep[i]);
80 }
81 self.dp[u] = self.add_root(&left[m], u);
82 for (k, a) in self.graph.adjacencies(u).enumerate() {
83 if a.to != p {
84 let i = self.reidx(u, a);
85 self.ep[i] = self.merge(&left[k], &right[k + 1]);
86 self.ep[i] = self.add_subroot(&self.ep[i], u, a.id);
87 self.efs(a.to, u);
88 }
89 }
90 }
91 fn rerooting(&mut self) {
92 for a in self.graph.adjacencies(0) {
93 self.dfs(a, 0);
94 }
95 self.efs(0, usize::MAX);
96 }Sourcefn efs(&mut self, u: usize, p: usize)
fn efs(&mut self, u: usize, p: usize)
Examples found in repository?
crates/competitive/src/tree/rerooting.rs (line 87)
69 fn efs(&mut self, u: usize, p: usize) {
70 let m = self.graph.adjacencies(u).len();
71 let mut left = vec![M::unit(); m + 1];
72 let mut right = vec![M::unit(); m + 1];
73 for (k, a) in self.graph.adjacencies(u).enumerate() {
74 let i = self.eidx(u, a);
75 left[k + 1] = self.merge(&left[k], &self.ep[i]);
76 }
77 for (k, a) in self.graph.adjacencies(u).enumerate().rev() {
78 let i = self.eidx(u, a);
79 right[k] = self.merge(&right[k + 1], &self.ep[i]);
80 }
81 self.dp[u] = self.add_root(&left[m], u);
82 for (k, a) in self.graph.adjacencies(u).enumerate() {
83 if a.to != p {
84 let i = self.reidx(u, a);
85 self.ep[i] = self.merge(&left[k], &right[k + 1]);
86 self.ep[i] = self.add_subroot(&self.ep[i], u, a.id);
87 self.efs(a.to, u);
88 }
89 }
90 }
91 fn rerooting(&mut self) {
92 for a in self.graph.adjacencies(0) {
93 self.dfs(a, 0);
94 }
95 self.efs(0, usize::MAX);
96 }Sourcefn rerooting(&mut self)
fn rerooting(&mut self)
Examples found in repository?
crates/competitive/src/tree/rerooting.rs (line 36)
27 pub fn new(graph: &'a UndirectedSparseGraph, rooting: F) -> Self {
28 let dp = vec![M::unit(); graph.vertices_size()];
29 let ep = vec![M::unit(); graph.vertices_size() * 2];
30 let mut self_ = Self {
31 graph,
32 dp,
33 ep,
34 rooting,
35 };
36 self_.rerooting();
37 self_
38 }Trait Implementations§
Auto Trait Implementations§
impl<'a, M, F> Freeze for ReRooting<'a, M, F>where
F: Freeze,
impl<'a, M, F> RefUnwindSafe for ReRooting<'a, M, F>
impl<'a, M, F> Send for ReRooting<'a, M, F>
impl<'a, M, F> Sync for ReRooting<'a, M, F>
impl<'a, M, F> Unpin for ReRooting<'a, M, F>
impl<'a, M, F> UnwindSafe for ReRooting<'a, M, F>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more