백준 알고리즘
[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();
}
}