not updated 1766.rs
This commit is contained in:
70
storage/zeta/rs/completed/1766.rs
Normal file
70
storage/zeta/rs/completed/1766.rs
Normal 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!();
|
||||
}
|
||||
Reference in New Issue
Block a user