|
1 | 1 | /* |
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 |
4 | 4 | */ |
5 | 5 |
|
6 | | -//I AM NOT DONE |
7 | | -use std::collections::VecDeque; |
| 6 | +use std::collections::HashSet; |
8 | 7 |
|
9 | | -// Define a graph |
10 | 8 | struct Graph { |
11 | 9 | adj: Vec<Vec<usize>>, |
12 | 10 | } |
13 | 11 |
|
14 | 12 | impl Graph { |
15 | | - // Create a new graph with n vertices |
16 | 13 | fn new(n: usize) -> Self { |
17 | 14 | Graph { |
18 | 15 | adj: vec![vec![]; n], |
19 | 16 | } |
20 | 17 | } |
21 | 18 |
|
22 | | - // Add an edge to the graph |
23 | 19 | fn add_edge(&mut self, src: usize, dest: usize) { |
24 | | - self.adj[src].push(dest); |
| 20 | + self.adj[src].push(dest); |
25 | 21 | self.adj[dest].push(src); |
26 | 22 | } |
27 | 23 |
|
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 | + } |
32 | 33 |
|
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); |
34 | 39 | visit_order |
35 | 40 | } |
36 | 41 | } |
37 | 42 |
|
38 | | - |
39 | 43 | #[cfg(test)] |
40 | 44 | mod tests { |
41 | 45 | use super::*; |
42 | 46 |
|
43 | 47 | #[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() { |
60 | 49 | let mut graph = Graph::new(3); |
61 | 50 | graph.add_edge(0, 1); |
62 | 51 | graph.add_edge(1, 2); |
63 | 52 |
|
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]); |
66 | 55 | } |
67 | 56 |
|
68 | 57 | #[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); |
71 | 60 | graph.add_edge(0, 1); |
| 61 | + graph.add_edge(0, 2); |
72 | 62 | graph.add_edge(1, 2); |
73 | | - graph.add_edge(2, 0); |
| 63 | + graph.add_edge(2, 3); |
| 64 | + graph.add_edge(3, 3); |
74 | 65 |
|
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]); |
77 | 68 | } |
78 | 69 |
|
79 | 70 | #[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); |
82 | 76 |
|
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]); |
85 | 81 | } |
86 | 82 | } |
87 | 83 |
|
0 commit comments