must be a DAG
(vertices: &HashSet<usize>, edges: &HashMap<usize, HashSet<usize>>)
| 19 | |
| 20 | // must be a DAG |
| 21 | pub fn topo_order(vertices: &HashSet<usize>, edges: &HashMap<usize, HashSet<usize>>) -> Vec<usize> { |
| 22 | let mut queue: Vec<usize> = Vec::new(); |
| 23 | let mut in_deg: HashMap<usize, usize> = HashMap::new(); |
| 24 | for &from in vertices.iter() { |
| 25 | in_deg.insert(from, 0); |
| 26 | } |
| 27 | for tos in edges.values() { |
| 28 | for &to in tos.iter() { |
| 29 | in_deg.entry(to).and_modify(|e| *e += 1); |
| 30 | } |
| 31 | } |
| 32 | for from in vertices.iter() { |
| 33 | if in_deg[from] == 0 { |
| 34 | queue.push(*from); |
| 35 | } |
| 36 | } |
| 37 | let mut i = 0; |
| 38 | while i < queue.len() { |
| 39 | let from = queue[i]; |
| 40 | i += 1; |
| 41 | if let Some(tos) = edges.get(&from) { |
| 42 | for &to in tos.iter() { |
| 43 | in_deg.entry(to).and_modify(|e| *e -= 1); |
| 44 | if in_deg[&to] == 0 { |
| 45 | queue.push(to); |
| 46 | } |
| 47 | } |
| 48 | } |
| 49 | } |
| 50 | queue |
| 51 | } |
no test coverage detected