1
use std::collections::{HashMap, VecDeque};3
pub fn sort_items(n: i32, m: i32, group: Vec<i32>, before_items: Vec<Vec<i32>>) -> Vec<i32> {4
let mut outer_graph: HashMap<i32, Vec<i32>> = HashMap::new();5
let mut inner_graph: HashMap<i32, HashMap<i32, Vec<i32>>> = HashMap::new();6
for i in 0..n as usize {7
if group[i] == -1 && before_items[i].is_empty() {8
outer_graph.entry(i as i32).or_default();9
} else if group[i] == -1 {10
outer_graph.entry(i as i32).or_default();11
for b in &before_items[i] {12
let gp = group[*b as usize];14
outer_graph.entry(*b).or_default().push(i as i32);16
outer_graph.entry(gp + 40000).or_default().push(i as i32);20
outer_graph.entry(group[i] + 40000).or_default();26
for b in &before_items[i] {27
let gp = group[*b as usize];29
outer_graph.entry(*b).or_default().push(group[i] + 40000);30
} else if group[i] == gp {41
.push(group[i] + 40000);46
if let Some(res) = Self::topo_sort(&outer_graph, &inner_graph) {47
if res.len() != n as usize {57
graph: &HashMap<i32, Vec<i32>>,58
inner_graph: &HashMap<i32, HashMap<i32, Vec<i32>>>,59
) -> Option<Vec<i32>> {60
let mut res: Vec<i32> = vec![];61
let mut in_degree: HashMap<i32, i32> = HashMap::new();62
let mut queue: VecDeque<i32> = VecDeque::new();64
in_degree.entry(*k).or_default();66
*in_degree.entry(*n).or_default() += 1;69
for (k, v) in &in_degree {74
while !queue.is_empty() {75
let n = queue.pop_front().unwrap();79
if let Some(mut s) = Self::topo_sort(&inner_graph[&(n - 40000)], inner_graph) {80
if s.len() != inner_graph[&(n - 40000)].len() {89
*in_degree.entry(*v).or_default() -= 1;90
if in_degree[v] == 0 {