Pagini recente » Cod sursa (job #3364968) | Cod sursa (job #3367111) | Cod sursa (job #3367113) | Cod sursa (job #3367048) | Cod sursa (job #3364891)
use std::fs;
use std::io::{BufWriter, Write, Read};
use std::collections::VecDeque;
fn bfs(start_node: usize, g: &Vec<Vec<usize>>, d: &mut Vec<i32>) -> () {
let mut q: VecDeque<usize> = VecDeque::new();
d[start_node] = 0;
q.push_back(start_node);
while let Some(node) = q.pop_front() {
for &son in &g[node] {
if d[son] == -1 {
q.push_back(son);
d[son] = d[node] + 1;
}
}
}
}
fn main() {
let file = fs::File::create("bfs.out").unwrap();
let mut writer = BufWriter::new(file);
let mut input_bytes = Vec::new();
fs::File::open("bfs.in").unwrap().read_to_end(&mut input_bytes).unwrap();
let mut cursor = 0;
let mut next_num = || -> usize {
while cursor < input_bytes.len() && input_bytes[cursor] <= b' ' {
cursor += 1;
}
if cursor == input_bytes.len() {
return 0;
}
let mut res = 0;
while cursor < input_bytes.len() && input_bytes[cursor] > b' ' {
res = res * 10 + (input_bytes[cursor] - b'0') as usize;
cursor += 1;
}
res
};
let (n, m, start_node) = (next_num(), next_num(), next_num());
let mut g: Vec<Vec<usize>> = vec![vec![]; n + 1];
for _ in 0..m {
let (x, y) = (next_num(), next_num());
g[x].push(y);
}
let mut dist: Vec<i32> = vec![-1; n + 1];
bfs(start_node, &g, &mut dist);
for i in 1..=n {
write!(writer, "{} ", dist[i]).unwrap();
}
}