Cod sursa(job #3364891)

Utilizator tryharderulbrebenel mihnea stefan tryharderul Data 13 septembrie 2026 02:27:31
Problema BFS - Parcurgere in latime Scor 100
Compilator rs Status done
Runda Arhiva educationala Marime 1.51 kb
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();
    }

}