Algorithm/Graph Traversal
[백준] 11725. 트리의 부모 찾기 / Java
Dev_Green
2023. 5. 30. 10:53
https://www.acmicpc.net/problem/11725
11725번: 트리의 부모 찾기
루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
www.acmicpc.net
문제 풀이
루트 노드인 1부터 DFS 탐색을 하기 때문에 DFS가 시작되는 노드가 부모가 되고, 이 노드에 연결되어 있으면서 아직 탐색되지 않은 노드를 찾는다면 그 노드가 자식 노드가 되게 된다.
다시 말해, 루트 노드로부터 아직 탐색되지 않은 노드를 탐색하며 해당 노드가 어느 노드로부터 왔는지를 찾아 parent[]에 저장한다.
소스 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class BOJ11725 {
static int N; // 노드 개수
static int[] parent; // 각 노드의 부모 노드
static boolean[] visited;
static List<Integer>[] graph; // 트리 정보를 담은 리스트 배열
static StringTokenizer st;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
visited = new boolean[N+1];
parent = new int[N+1];
graph = new List[N+1];
for (int i = 0; i < N+1; i++) {
graph[i] = new ArrayList<>();
}
for (int i = 0; i < N-1; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
graph[a].add(b);
graph[b].add(a);
}
dfs(1);
for (int i = 2; i < parent.length; i++) {
System.out.println(parent[i]);
}
}
static void dfs(int index) {
visited[index] = true;
for (int i : graph[index]) {
if (!visited[i]) {
// index 노드에 연결된 노드 중 아직 탐색되지 않은 노드 i는 index 노드를 부모로 갖는다
parent[i] = index;
dfs(i);
}
}
}
}