백준 11725: 트리의 부모 찾기 [Java] -포포
2022. 9. 13. 09:53ㆍ알고리즘/BFS 알고리즘
문제
루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.
출력
첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main{
static int n;
static int[] parent;
static boolean[] visit;
static ArrayList<Integer>[] list;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
StringTokenizer st;
parent = new int[n + 1];
visit = new boolean[n + 1];
list = new ArrayList[n + 1];
for (int i = 0; i <= n; i++) {
list[i] = new ArrayList<>();
}
int a, b;
for (int i = 0; i < n - 1; i++) {
st = new StringTokenizer(br.readLine());
a = Integer.parseInt(st.nextToken());
b = Integer.parseInt(st.nextToken());
list[a].add(b);
list[b].add(a);
}
visit[1] = true;
dfs(1);
StringBuilder sb = new StringBuilder();
for (int i = 2; i <= n; i++) {
sb.append(parent[i]).append('\n');
}
System.out.println(sb);
}
private static void dfs(int start) {
for(int a : list[start]){
if(!visit[a]){
parent[a] = start;
visit[a] = true;
dfs(a);
}
}
}
}
먼저, 노드의 개수(N)가 최대 100,000이므로 이중 배열이 아닌 ArrayList[]로 해결했다.
이중 배열로 해결하려고 하면 메모리 초과가 발생한다.
1번 노드부터 시작하여 연결된 다음 노드로 이동한다. 이동하기 전에, 방문처리를 해준 뒤
parent[다음 노드의 인덱스] = 현재 노드 번호 설정이 필요하다.
입력한 뒤 탐색이 종료되면 parent 배열을 출력한다.
'알고리즘 > BFS 알고리즘' 카테고리의 다른 글
백준 2146: 다리만들기 [Java] - 포포 (0) | 2022.10.10 |
---|---|
백준 14502: 연구소 [Java] - 포포 (0) | 2022.10.09 |
백준 11724: 연결 요소의 개수 [Java] - 포포 (0) | 2022.05.19 |
백준 12716: 돌다리 [Java] - 포포 (0) | 2022.05.17 |
백준 1388: 바닥 장식 [Java] - 포포 (0) | 2022.05.16 |