Skip to content

Commit 975cdf9

Browse files
authored
Simplified Euler path
1 parent 6df6277 commit 975cdf9

File tree

1 file changed

+9
-17
lines changed

1 file changed

+9
-17
lines changed

src/graph.rs

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -67,28 +67,21 @@ impl Graph {
6767
}
6868
}
6969

70-
fn euler_helper(&self, u: usize, adj: &mut [AdjListIterator])
71-
-> ::std::collections::LinkedList<usize> {
72-
let mut edges = ::std::collections::LinkedList::new();
73-
if let Some((e, v)) = adj[u].next() {
74-
let mut tail_path = self.euler_helper(v, adj);
75-
if let Some((e2, v2)) = adj[u].next() {
76-
edges.push_back(e2);
77-
edges.append(&mut self.euler_helper(v2, adj));
78-
}
79-
edges.push_back(e);
80-
edges.append(&mut tail_path);
81-
assert_eq!(None, adj[u].next());
70+
fn euler_helper(&self, u: usize, adj: &mut [AdjListIterator], edges: &mut Vec<usize>) {
71+
while let Some((e, v)) = adj[u].next() {
72+
self.euler_helper(v, adj, edges);
73+
edges.push(e);
8274
}
83-
edges
8475
}
8576

8677
// Finds an Euler path starting from u, assuming it exists, and that the
8778
// graph is directed.
88-
pub fn euler_path(&self, u: usize) -> ::std::collections::LinkedList<usize> {
79+
pub fn euler_path(&self, u: usize) -> Vec<usize> {
8980
let mut adj_iters = (0..self.num_v()).map(|u| self.adj_list(u))
9081
.collect::<Vec<_>>();
91-
self.euler_helper(u, &mut adj_iters)
82+
let mut edges = Vec::with_capacity(self.num_e());
83+
self.euler_helper(u, &mut adj_iters, &mut edges);
84+
edges.into_iter().rev().collect()
9285
}
9386
}
9487

@@ -352,8 +345,7 @@ mod test {
352345
graph.add_edge(1, 0);
353346
graph.add_edge(1, 2);
354347
graph.add_edge(2, 1);
355-
let euler = graph.euler_path(0).into_iter().collect::<Vec<_>>();
356-
assert_eq!(euler, vec![0, 2, 3, 1]);
348+
assert_eq!(graph.euler_path(0), vec![0, 2, 3, 1]);
357349
}
358350

359351
#[test]

0 commit comments

Comments
 (0)