백준 11725 - 트리의 부모 찾기 [Rust]

[Silver II] 트리의 부모 찾기 - 11725

Posted by Hebi on May 9, 2023

백준 알고리즘

[Silver II] 트리의 부모 찾기 - 11725

문제 링크

성능 요약

메모리: 21280 KB, 시간: 52 ms

분류

그래프 이론, 그래프 탐색, 트리, 너비 우선 탐색, 깊이 우선 탐색

문제 설명

루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.

출력

첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
use std::{collections::VecDeque, usize};
use std::io::{BufReader,BufRead,BufWriter,Write,stdin,stdout};
const MAX: usize = 100001;

fn bfs(graph: &Vec<Vec<usize>>, ans: &mut [usize], visit: &mut [bool]) {
    let mut q: VecDeque<usize> = VecDeque::new();
    visit[1] = true;
    q.push_back(1);

    while let Some(parent) = q.pop_front() {
        for &child in &graph[parent] {
            if !visit[child] {
                ans[child] = parent;
                visit[child] = true;
                q.push_back(child);
            }
        }
    }
}

fn main() {
    let mut reader= BufReader::new(stdin().lock());
    let mut graph: Vec<Vec<usize>> = vec![Vec::new(); MAX];
    let mut visit: [bool; MAX] = [false; MAX];
    let mut ans: [usize; MAX] = [0; MAX];
   let mut writer= BufWriter::new(stdout().lock());
    let mut input = String::new();
    reader.read_line(&mut input).unwrap();
    let n: usize = input.trim().parse().unwrap();

    for _ in 0..n-1 {
        input.clear();
        reader.read_line(&mut input).unwrap();
        let mut nums = input.trim().split_whitespace().map(|x| x.parse::<usize>().unwrap());
        let x = nums.next().unwrap();
        let y = nums.next().unwrap();
        graph[x].push(y);
        graph[y].push(x);
    }

    bfs(&graph, &mut ans, &mut visit);

    for i in 2..=n {
        writeln!(writer,"{}", ans[i]).unwrap();
    }
}