백준 JAVA11 11725번 : 트리의 부모 찾기
트리의 부모 찾기
시간 제한 | 메모리 제한 |
---|---|
1 초 | 256 MB |
문제
루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.
출력
첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.
예제 입력 1
7
1 6
6 3
3 5
4 1
2 4
4 7
예제 출력 1
4
6
1
3
1
4
예제 입력 2
12
1 2
1 3
2 4
3 5
3 6
4 7
4 8
5 9
5 10
6 11
6 12
예제 출력 2
1
1
2
3
3
4
4
5
5
6
6
출처
Idea.
- 주어지는 데이터는 연결돼 있는 두 노드 → 양방향 엣지
- 1번 노드 부터 DFS로 탐색해 부모노드를 찾아준다.
- 방문하지 않은 노드로 갈 때, 부모노드를 정답 배열에 추가해준다.
Code.
package tree;
import java.util.ArrayList;
import java.util.Scanner;
public class P11725_searchingTreeParents {
static ArrayList<Integer>[] tree;
static int[] answer;
static boolean[] visited;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
tree = new ArrayList[N + 1];
visited = new boolean[N + 1];
for (int i = 0; i <= N; i++) {
tree[i] = new ArrayList<Integer>();
}
for (int i = 1; i < N; i++) {
int x = sc.nextInt();
int y = sc.nextInt();
tree[x].add(y);
tree[y].add(x);
}
answer = new int[N + 1];
int rootNode = 1;
dfs(rootNode);
for (int i = 2; i <= N; i++) {
System.out.println(answer[i]);
}
}
private static void dfs(int node) {
if (visited[node])
return;
visited[node] = true;
for (int i : tree[node]) {
if (visited[i] == false)
answer[i] = node;
dfs(i);
}
}
}
Leave a comment