competitive/graph/
order.rs1use super::SparseGraph;
2
3#[codesnip::entry("bfs_order", include("SparseGraph"))]
4impl<D> SparseGraph<D> {
5 pub fn bfs_order(&self, root: usize) -> Vec<usize> {
6 let mut visited = vec![false; self.vertices_size()];
7 let mut ord = Vec::with_capacity(self.vertices_size());
8 visited[root] = true;
9 let mut deq = std::collections::VecDeque::new();
10 deq.push_back(root);
11 while let Some(u) = deq.pop_front() {
12 ord.push(u);
13 for a in self.adjacencies(u).rev() {
14 if !visited[a.to] {
15 visited[a.to] = true;
16 deq.push_back(a.to);
17 }
18 }
19 }
20 ord
21 }
22}
23
24#[codesnip::entry("dfs_order", include("SparseGraph"))]
25impl<D> SparseGraph<D> {
26 pub fn dfs_order(&self, root: usize) -> Vec<usize> {
27 let mut visited = vec![false; self.vertices_size()];
28 let mut ord = Vec::with_capacity(self.vertices_size());
29 visited[root] = true;
30 let mut stack = vec![root];
31 while let Some(u) = stack.pop() {
32 ord.push(u);
33 for a in self.adjacencies(u).rev() {
34 if !visited[a.to] {
35 visited[a.to] = true;
36 stack.push(a.to);
37 }
38 }
39 }
40 ord
41 }
42}
43
44#[codesnip::entry("dfs_tree", include("SparseGraph"))]
45impl<D> SparseGraph<D> {
46 pub fn dfs_tree(&self, root: usize) -> Vec<bool> {
47 let mut visited = vec![false; self.vertices_size()];
48 let mut used = vec![false; self.edges_size()];
49 visited[root] = true;
50 let mut stack = vec![root];
51 while let Some(u) = stack.pop() {
52 for a in self.adjacencies(u).rev() {
53 if !visited[a.to] {
54 visited[a.to] = true;
55 used[a.id] = true;
56 stack.push(a.to);
57 }
58 }
59 }
60 used
61 }
62}
63
64#[codesnip::entry("for_each_connected_components", include("SparseGraph"))]
65impl<D> SparseGraph<D> {
66 pub fn for_each_connected_components<F>(&self, mut f: F)
68 where
69 F: FnMut(&Self, usize, &[(usize, usize)]),
70 {
71 let mut visited = vec![false; self.vertices_size()];
72 let mut ord = Vec::with_capacity(self.vertices_size());
73 for u in self.vertices() {
74 if !visited[u] {
75 visited[u] = true;
76 ord.push((u, !0));
77 let mut i = 0;
78 while i < ord.len() {
79 let u = ord[i].0;
80 for a in self.adjacencies(u).rev() {
81 if !visited[a.to] {
82 visited[a.to] = true;
83 ord.push((a.to, u));
84 }
85 }
86 i += 1;
87 }
88 f(self, u, &ord);
89 ord.clear();
90 }
91 }
92 }
93}