Skip to main content

EulerTourBuilder

Struct EulerTourBuilder 

Source
pub struct EulerTourBuilder<'a, K>
where K: EulerTourKind,
{ tree: &'a UndirectedSparseGraph, root: usize, vidx: Vec<[usize; 2]>, eidx: Vec<[usize; 2]>, pos: usize, _marker: PhantomData<fn() -> K>, }

Fields§

§tree: &'a UndirectedSparseGraph§root: usize§vidx: Vec<[usize; 2]>§eidx: Vec<[usize; 2]>§pos: usize§_marker: PhantomData<fn() -> K>

Implementations§

Source§

impl<'a, K> EulerTourBuilder<'a, K>
where K: EulerTourKind,

Source

pub fn new(tree: &'a UndirectedSparseGraph, root: usize) -> Self

Examples found in repository?
crates/competitive/src/tree/euler_tour.rs (line 174)
170    pub fn subtree_euler_tour_builder<'a>(
171        &'a self,
172        root: usize,
173    ) -> EulerTourBuilder<'a, marker::First> {
174        EulerTourBuilder::new(self, root)
175    }
176
177    pub fn path_euler_tour_builder<'a>(
178        &'a self,
179        root: usize,
180    ) -> EulerTourBuilder<'a, marker::FirstLast> {
181        EulerTourBuilder::new(self, root)
182    }
183
184    pub fn full_euler_tour_builder<'a>(
185        &'a self,
186        root: usize,
187    ) -> EulerTourBuilder<'a, marker::Visit> {
188        EulerTourBuilder::new(self, root)
189    }
Source

pub fn build_with_trace(self, trace: impl FnMut(usize)) -> EulerTour<K>

Examples found in repository?
crates/competitive/src/tree/euler_tour.rs (line 91)
90    pub fn build(self) -> EulerTour<K> {
91        self.build_with_trace(|_u| {})
92    }
93
94    fn dfs(&mut self, u: usize, parent: usize, trace: &mut impl FnMut(usize)) {
95        self.vidx[u][0] = self.pos;
96        trace(u);
97        self.pos += 1;
98        for a in self.tree.neighbors(u) {
99            if a.to != parent {
100                self.eidx[a.label][0] = self.pos;
101                self.dfs(a.to, u, trace);
102                self.eidx[a.label][1] = self.pos;
103                if K::USE_VISIT {
104                    trace(u);
105                    self.pos += 1;
106                }
107            }
108        }
109        self.vidx[u][1] = self.pos;
110        if K::USE_LAST {
111            trace(u);
112            self.pos += 1;
113        }
114    }
115}
116
117impl EulerTourBuilder<'_, marker::First> {
118    pub fn build_with_rearrange<T>(self, s: &[T]) -> (EulerTour<marker::First>, Vec<T>)
119    where
120        T: Clone,
121    {
122        assert_eq!(s.len(), self.tree.vertices_size());
123        let mut trace = Vec::with_capacity(marker::First::size(s.len()));
124        let tour = self.build_with_trace(|u| {
125            trace.push(s[u].clone());
126        });
127        (tour, trace)
128    }
129}
130
131impl EulerTourBuilder<'_, marker::FirstLast> {
132    pub fn build_with_rearrange<T>(
133        self,
134        s: &[T],
135        mut inverse: impl FnMut(T) -> T,
136    ) -> (EulerTour<marker::FirstLast>, Vec<T>)
137    where
138        T: Clone,
139    {
140        assert_eq!(s.len(), self.tree.vertices_size());
141        let mut visited = vec![false; s.len()];
142        let mut trace = Vec::with_capacity(marker::FirstLast::size(s.len()));
143        let tour = self.build_with_trace(|u| {
144            if !visited[u] {
145                trace.push(s[u].clone());
146                visited[u] = true;
147            } else {
148                trace.push(inverse(s[u].clone()));
149            }
150        });
151        (tour, trace)
152    }
153}
154
155impl EulerTourBuilder<'_, marker::Visit> {
156    pub fn build_with_rearrange<T>(self, s: &[T]) -> (EulerTour<marker::Visit>, Vec<T>)
157    where
158        T: Clone,
159    {
160        assert_eq!(s.len(), self.tree.vertices_size());
161        let mut trace = Vec::with_capacity(marker::Visit::size(s.len()));
162        let tour = self.build_with_trace(|u| {
163            trace.push(s[u].clone());
164        });
165        (tour, trace)
166    }
Source

pub fn build(self) -> EulerTour<K>

Examples found in repository?
crates/aizu_online_judge/src/grl/grl_5_d.rs (line 23)
15pub fn grl_5_d(reader: impl Read, writer: impl Write) {
16    prepare_io!(reader, writer);
17    sc!(n, c: [SizedCollect<usize>; iter n]);
18    let edges = c
19        .enumerate()
20        .flat_map(|(u, it)| it.into_iter().map(move |v| (u, v)))
21        .collect();
22    let graph = UndirectedSparseGraph::from_edges(n, edges);
23    let et = graph.path_euler_tour_builder(0).build();
24    let mut bit = BinaryIndexedTree::<AdditiveOperation<_>>::new(et.size);
25
26    sc!(q);
27    for _ in 0..q {
28        sc!(query: Query);
29        match query {
30            Query::Add { v, w } => {
31                et.update(v, w, -w, |k, x| bit.update(k, x));
32            }
33            Query::Get { u } => {
34                let ans = et.fold(u, |k| bit.accumulate(k));
35                pp!(ans);
36            }
37        }
38    }
39}
Source

fn dfs(&mut self, u: usize, parent: usize, trace: &mut impl FnMut(usize))

Examples found in repository?
crates/competitive/src/tree/euler_tour.rs (line 80)
79    pub fn build_with_trace(mut self, mut trace: impl FnMut(usize)) -> EulerTour<K> {
80        self.dfs(self.root, !0, &mut trace);
81        EulerTour {
82            root: self.root,
83            vidx: self.vidx,
84            eidx: self.eidx,
85            size: self.pos,
86            _marker: PhantomData,
87        }
88    }
89
90    pub fn build(self) -> EulerTour<K> {
91        self.build_with_trace(|_u| {})
92    }
93
94    fn dfs(&mut self, u: usize, parent: usize, trace: &mut impl FnMut(usize)) {
95        self.vidx[u][0] = self.pos;
96        trace(u);
97        self.pos += 1;
98        for a in self.tree.neighbors(u) {
99            if a.to != parent {
100                self.eidx[a.label][0] = self.pos;
101                self.dfs(a.to, u, trace);
102                self.eidx[a.label][1] = self.pos;
103                if K::USE_VISIT {
104                    trace(u);
105                    self.pos += 1;
106                }
107            }
108        }
109        self.vidx[u][1] = self.pos;
110        if K::USE_LAST {
111            trace(u);
112            self.pos += 1;
113        }
114    }
Source§

impl EulerTourBuilder<'_, First>

Source

pub fn build_with_rearrange<T>(self, s: &[T]) -> (EulerTour<First>, Vec<T>)
where T: Clone,

Source§

impl EulerTourBuilder<'_, FirstLast>

Source

pub fn build_with_rearrange<T>( self, s: &[T], inverse: impl FnMut(T) -> T, ) -> (EulerTour<FirstLast>, Vec<T>)
where T: Clone,

Source§

impl EulerTourBuilder<'_, Visit>

Source

pub fn build_with_rearrange<T>(self, s: &[T]) -> (EulerTour<Visit>, Vec<T>)
where T: Clone,

Trait Implementations§

Source§

impl<'a, K> Debug for EulerTourBuilder<'a, K>
where K: EulerTourKind + Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a, K> Freeze for EulerTourBuilder<'a, K>
where PhantomData<fn() -> K>: Freeze,

§

impl<'a, K> RefUnwindSafe for EulerTourBuilder<'a, K>
where PhantomData<fn() -> K>: RefUnwindSafe,

§

impl<'a, K> Send for EulerTourBuilder<'a, K>
where PhantomData<fn() -> K>: Send,

§

impl<'a, K> Sync for EulerTourBuilder<'a, K>
where PhantomData<fn() -> K>: Sync,

§

impl<'a, K> Unpin for EulerTourBuilder<'a, K>
where PhantomData<fn() -> K>: Unpin,

§

impl<'a, K> UnsafeUnpin for EulerTourBuilder<'a, K>
where PhantomData<fn() -> K>: UnsafeUnpin,

§

impl<'a, K> UnwindSafe for EulerTourBuilder<'a, K>
where PhantomData<fn() -> K>: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToArrayVecScalar for T

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.