Skip to content

Commit 645bdf4

Browse files
authored
Update algorithm5.rs
1 parent d0608d8 commit 645bdf4

File tree

1 file changed

+37
-41
lines changed

1 file changed

+37
-41
lines changed

exercises/algorithm/algorithm5.rs

Lines changed: 37 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,87 +1,83 @@
11
/*
2-
bfs
3-
This problem requires you to implement a basic BFS algorithm
2+
dfs
3+
This problem requires you to implement a basic DFS traversal
44
*/
55

6-
//I AM NOT DONE
7-
use std::collections::VecDeque;
6+
use std::collections::HashSet;
87

9-
// Define a graph
108
struct Graph {
119
adj: Vec<Vec<usize>>,
1210
}
1311

1412
impl Graph {
15-
// Create a new graph with n vertices
1613
fn new(n: usize) -> Self {
1714
Graph {
1815
adj: vec![vec![]; n],
1916
}
2017
}
2118

22-
// Add an edge to the graph
2319
fn add_edge(&mut self, src: usize, dest: usize) {
24-
self.adj[src].push(dest);
20+
self.adj[src].push(dest);
2521
self.adj[dest].push(src);
2622
}
2723

28-
// Perform a breadth-first search on the graph, return the order of visited nodes
29-
fn bfs_with_return(&self, start: usize) -> Vec<usize> {
30-
31-
//TODO
24+
fn dfs_util(&self, v: usize, visited: &mut HashSet<usize>, visit_order: &mut Vec<usize>) {
25+
visited.insert(v);
26+
visit_order.push(v);
27+
self.adj[v].iter().for_each(|&next|{
28+
if !visited.contains(&next) {
29+
self.dfs_util(next, visited, visit_order);
30+
}
31+
});
32+
}
3233

33-
let mut visit_order = vec![];
34+
// Perform a depth-first search on the graph, return the order of visited nodes
35+
fn dfs(&self, start: usize) -> Vec<usize> {
36+
let mut visited = HashSet::new();
37+
let mut visit_order = Vec::new();
38+
self.dfs_util(start, &mut visited, &mut visit_order);
3439
visit_order
3540
}
3641
}
3742

38-
3943
#[cfg(test)]
4044
mod tests {
4145
use super::*;
4246

4347
#[test]
44-
fn test_bfs_all_nodes_visited() {
45-
let mut graph = Graph::new(5);
46-
graph.add_edge(0, 1);
47-
graph.add_edge(0, 4);
48-
graph.add_edge(1, 2);
49-
graph.add_edge(1, 3);
50-
graph.add_edge(1, 4);
51-
graph.add_edge(2, 3);
52-
graph.add_edge(3, 4);
53-
54-
let visited_order = graph.bfs_with_return(0);
55-
assert_eq!(visited_order, vec![0, 1, 4, 2, 3]);
56-
}
57-
58-
#[test]
59-
fn test_bfs_different_start() {
48+
fn test_dfs_simple() {
6049
let mut graph = Graph::new(3);
6150
graph.add_edge(0, 1);
6251
graph.add_edge(1, 2);
6352

64-
let visited_order = graph.bfs_with_return(2);
65-
assert_eq!(visited_order, vec![2, 1, 0]);
53+
let visit_order = graph.dfs(0);
54+
assert_eq!(visit_order, vec![0, 1, 2]);
6655
}
6756

6857
#[test]
69-
fn test_bfs_with_cycle() {
70-
let mut graph = Graph::new(3);
58+
fn test_dfs_with_cycle() {
59+
let mut graph = Graph::new(4);
7160
graph.add_edge(0, 1);
61+
graph.add_edge(0, 2);
7262
graph.add_edge(1, 2);
73-
graph.add_edge(2, 0);
63+
graph.add_edge(2, 3);
64+
graph.add_edge(3, 3);
7465

75-
let visited_order = graph.bfs_with_return(0);
76-
assert_eq!(visited_order, vec![0, 1, 2]);
66+
let visit_order = graph.dfs(0);
67+
assert_eq!(visit_order, vec![0, 1, 2, 3]);
7768
}
7869

7970
#[test]
80-
fn test_bfs_single_node() {
81-
let mut graph = Graph::new(1);
71+
fn test_dfs_disconnected_graph() {
72+
let mut graph = Graph::new(5);
73+
graph.add_edge(0, 1);
74+
graph.add_edge(0, 2);
75+
graph.add_edge(3, 4);
8276

83-
let visited_order = graph.bfs_with_return(0);
84-
assert_eq!(visited_order, vec![0]);
77+
let visit_order = graph.dfs(0);
78+
assert_eq!(visit_order, vec![0, 1, 2]);
79+
let visit_order_disconnected = graph.dfs(3);
80+
assert_eq!(visit_order_disconnected, vec![3, 4]);
8581
}
8682
}
8783

0 commit comments

Comments
 (0)