알고리즘/백준 등

[백준] 트리의 부모 찾기

컵라면만두세트 2021. 6. 27. 14:44

트리의 부모 찾기

문제

루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.

출력

첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.

package 백준;

import java.util.ArrayList;
import java.util.Scanner;
/*
 * dfs 풀
 * */

public class 트리의부모찾기 {
	static int n;
	static ArrayList<Integer> [] list;
	static int[] parents;
	static boolean[] check;
	
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		
		list = new ArrayList[n+1];
		parents = new int[n+1];
		check = new boolean[n+1];
		
		// arraylist 에 담기 
		for(int i=0; i<=n; i++) {
			list[i] = new ArrayList<Integer>();
		}
		for(int j = 1; j<n; j++) {
			int a = sc.nextInt();
			int b = sc.nextInt();
			list[a].add(b);
			list[b].add(a);
		}
		
		for(int k=1; k<=n; k++) {
			if(!check[k]) {
				dfs(k);
			}
		}
		for(int i =2; i<=n; i++) {
			System.out.println(parents[i]);
		}
		
	}


	private static void dfs(int v) {
		// 기저 조건 
		if(check[v]) {
			return;
		}
		check[v] = true;
		
		
		// 구현부 
		for(int vv : list[v]) {
			// 	방문 하지 않았다면 
			if(!check[vv]) {
				parents[vv] = v;
				dfs(vv);
			}
		}
	}
	

}