complete 1766.rs

This commit is contained in:
2025-06-19 16:57:52 +09:00
parent 47233029de
commit ea99bd4904

70
storage/zeta/rs/1766.rs Normal file
View File

@@ -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<usize> {
let mut order = Vec::new();
let mut graph: Vec<Vec<usize>> = 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!();
}