71 lines
1.6 KiB
Rust
71 lines
1.6 KiB
Rust
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!();
|
|
}
|