간선만 던져주고 트리의 부모를 찾으라고 한다.
IQ 130 이상이면 정보를 구체화해서 머리 속에서 그릴 수 있다던데 나처럼 IQ가 130 미만이라면 직접 손으로 그려보자.
이렇게 생긴 트리였다. 이진 트리 아님.
출력은 2번 노드의 부모 ~ N번 노드의 부모가 나오면 된다.
DFS 알고리즘에 대해 떠올려보자
우리가 특정 노드를 탐색하기 위해서는 항상 그 노드의 부모 노드를 거치게 된다.
static void dfs(int node) {
visited[node] = true;
for (int v : edges.get(node)) {
if (!visited[v]) {
dfs(v);
}
}
}
이게 기본적인 dfs 알고리즘의 재귀함수인데
여기서 node는 각 정점을 의미하고 v는 그곳에서 파생된 자식 node를 의미한다.
그러면 부모 노드를 구하기 위해 어떻게 해야할까?
이제 다 알려줬기 때문에 여기까지 봤는데도 몰라서 답을 본다면 받아쓰기다.
잘 모르겠으면 답을 보지 말고 dfs 알고리즘을 더 공부해보자
-- > 정답
import java.util.*;
import java.io.*;
public class Main {
static ArrayList<ArrayList<Integer>> edges = new ArrayList<>();
static boolean[] visited;
static int[] parents;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int nodes = Integer.parseInt(br.readLine());
for (int i=0; i<=nodes; i++) {
edges.add(new ArrayList<>());
}
for (int i=0; i<nodes-1; i++) {
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int node1 = Integer.parseInt(st.nextToken());
int node2 = Integer.parseInt(st.nextToken());
Main.edges.get(node1).add(node2);
Main.edges.get(node2).add(node1);
}
visited = new boolean[nodes+1];
parents = new int[nodes+1];
dfs(1);
// 루트인 1번 노드부터 시작한다.
for (int i=2; i<parents.length; i++) {
System.out.println(parents[i]);
// 2번 노드부터 부모를 구하면 된다.
}
}
static void dfs(int node) {
visited[node] = true;
for (int v : edges.get(node)) {
if (!visited[v]) {
dfs(v);
parents[v]=node;
//임의 노드 v를 만나기 위해서는 반드시 부모노드 node를 지난다.
// 따라서 부모 노드는 반복문 안에서 만나는 node
}
}
}
}
'CS ﹒ Algorithm > Baekjoon' 카테고리의 다른 글
Java 백준 문제풀이 (32) 1260: DFS와 BFS (0) | 2022.07.31 |
---|---|
Java 백준 문제풀이 (31) 2606: 바이러스 (0) | 2022.07.30 |
Java 백준 문제풀이 (29) 2444: 알고리즘 수업 - 너비 우선 탐색 1 (0) | 2022.07.28 |
Java 백준 문제풀이(28) 24479: 알고리즘 수업 - 깊이 우선 탐색1 (+24480 깊이 우선 탐색2) (0) | 2022.07.27 |
JAVA 백준 문제풀이(27) 10828:스택, 19258:큐2 (0) | 2022.07.26 |