|
1 | | -pub fn dfs_order(adj: &[Vec<usize>]) -> Vec<usize> { |
2 | | - let n = adj.len(); |
3 | | - fn dfs(u: usize, adj: &[Vec<usize>], seen: &mut [bool], order: &mut Vec<usize>) { |
4 | | - order.push(u); |
5 | | - seen[u] = true; |
6 | | - for &v in &adj[u] { |
7 | | - if !seen[v] { |
8 | | - dfs(v, adj, seen, order); |
9 | | - } |
| 1 | +fn dfs_preorder(u: usize, adj: &[Vec<usize>], seen: &mut [bool], order: &mut Vec<usize>) { |
| 2 | + order.push(u); |
| 3 | + seen[u] = true; |
| 4 | + for &v in &adj[u] { |
| 5 | + if !seen[v] { |
| 6 | + dfs_preorder(v, adj, seen, order); |
| 7 | + } |
| 8 | + } |
| 9 | +} |
| 10 | + |
| 11 | +fn dfs_postorder(u: usize, adj: &[Vec<usize>], seen: &mut [bool], order: &mut Vec<usize>) { |
| 12 | + seen[u] = true; |
| 13 | + for &v in &adj[u] { |
| 14 | + if !seen[v] { |
| 15 | + dfs_postorder(v, adj, seen, order); |
10 | 16 | } |
11 | 17 | } |
| 18 | + order.push(u); |
| 19 | +} |
| 20 | + |
| 21 | +fn get_dfs_order<F>(adj: &[Vec<usize>], dfs_order: F) -> Vec<usize> |
| 22 | +where |
| 23 | + F: Fn(usize, &[Vec<usize>], &mut [bool], &mut Vec<usize>), |
| 24 | +{ |
| 25 | + let n = adj.len(); |
12 | 26 | let mut seen = vec![false; n]; |
13 | 27 | let mut order = Vec::with_capacity(n); |
14 | 28 | for s in 0..n { |
15 | 29 | if !seen[s] { |
16 | | - dfs(s, adj, &mut seen, &mut order); |
| 30 | + dfs_order(s, adj, &mut seen, &mut order); |
17 | 31 | } |
18 | 32 | } |
19 | 33 | order |
20 | 34 | } |
| 35 | + |
| 36 | +pub fn get_dfs_preorder(adj: &[Vec<usize>]) -> Vec<usize> { |
| 37 | + get_dfs_order(adj, dfs_preorder) |
| 38 | +} |
| 39 | + |
| 40 | +pub fn get_dfs_postorder(adj: &[Vec<usize>]) -> Vec<usize> { |
| 41 | + get_dfs_order(adj, dfs_postorder) |
| 42 | +} |
0 commit comments