양방향 그래프가 입력된다.
1번 노드가 루트 노드일 때의
각 노드들의 부모 노드를 출력해야 한다.
1번 노드부터 방문하지 않은 연결된 노드들
을 탐색하며,
해당 연결된 노드들
의 부모 노드를 현재 노드로 기록
한다.
리프 노드
가 나올 때까지 연결된 노드들
의 방문하지 않은 연결된 노드들
도 방문한다.
public static void main(String[] args) throws IOException {
...
nodeVisited = new boolean[N + 1];
parents = new int[N + 1];
setChildrenParent(1);
...
}
private static void setChildrenParent(int idx) {
nodeVisited[idx] = true;
for (int node : nodes[idx]) {
if (!nodeVisited[node]) {
parents[node] = idx;
setChildrenParent(node);
}
}
}
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 _11725 {
private static int N;
private static List<Integer>[] nodes;
private static boolean[] nodeVisited;
private static int[] parents;
public static void main(String[] args) throws IOException {
// input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
nodes = new List[N + 1];
for (int i=0; i<=N; i++) {
nodes[i] = new ArrayList<>();
}
for (int i=0; i<N-1; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int from = Integer.parseInt(st.nextToken());
int to = Integer.parseInt(st.nextToken());
nodes[from].add(to);
nodes[to].add(from);
}
// dfs
nodeVisited = new boolean[N + 1];
parents = new int[N + 1];
setChildrenParent(1);
// result
StringBuilder sb = new StringBuilder();
for (int i=2; i<=N; i++) {
sb.append(parents[i]);
sb.append('\n');
}
System.out.print(sb);
}
private static void setChildrenParent(int idx) {
nodeVisited[idx] = true;
for (int node : nodes[idx]) {
if (!nodeVisited[node]) {
parents[node] = idx;
setChildrenParent(node);
}
}
}
}