1 minute read

트리의 부모 찾기

시간 제한 메모리 제한
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

출처

  • 문제를 만든 사람: baekjoon
  • 잘못된 조건을 찾은 사람: jh05013

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