From ea99bd4904db5436eb869cc6a8b63884fba95949 Mon Sep 17 00:00:00 2001 From: yenru0 Date: Thu, 19 Jun 2025 16:57:52 +0900 Subject: [PATCH] complete 1766.rs --- storage/zeta/rs/1766.rs | 70 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 storage/zeta/rs/1766.rs diff --git a/storage/zeta/rs/1766.rs b/storage/zeta/rs/1766.rs new file mode 100644 index 0000000..3d9f690 --- /dev/null +++ b/storage/zeta/rs/1766.rs @@ -0,0 +1,70 @@ +use std::cmp::Reverse; +use std::collections::BinaryHeap; +use std::io; + +fn split_by_2(s: &str) -> (usize, usize) { + let mut iter = s.split_ascii_whitespace(); + ( + iter.next().unwrap().parse().unwrap(), + iter.next().unwrap().parse().unwrap(), + ) +} + +fn get_order(n: usize, precedents: Vec<(usize, usize)>) -> Vec { + let mut order = Vec::new(); + + let mut graph: Vec> = vec![Vec::new(); n]; + + let mut indeg = vec![0; n]; + + let mut queue = BinaryHeap::new(); + + for (prec, succ) in precedents { + indeg[succ - 1] += 1; + graph[prec - 1].push(succ - 1); + } + for i in 0..n { + graph[i].sort(); + } + + for (i, indeg) in indeg.iter().enumerate() { + if *indeg == 0 { + queue.push(Reverse(i)); + } + } + + while !queue.is_empty() { + let now = queue.pop().unwrap().0; + order.push(now); + + for succ in graph[now].iter() { + indeg[*succ] -= 1; + if indeg[*succ] == 0 { + queue.push(Reverse(*succ)); + } + } + } + + order +} + +fn main() { + let mut line = String::new(); + io::stdin().read_line(&mut line).unwrap(); + let (n, m): (usize, usize); + (n, m) = split_by_2(&line); + let precedents: Vec<(usize, usize)>; + + precedents = (0..m) + .map(|_| { + let mut line = String::new(); + io::stdin().read_line(&mut line).unwrap(); + split_by_2(&line) + }) + .collect(); + + get_order(n, precedents) + .into_iter() + .for_each(|i| print!("{} ", i + 1)); + println!(); +}