https://www.acmicpc.net/problem/11725
11725번: 트리의 부모 찾기
루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
www.acmicpc.net
코드설명
트리(Tree) + DFS(깊이우선탐색)를 활용합니다.
트리의 루트노드는 1번 노드로 고정되어 있습니다.
그렇기에, 1번 노드부터 시작하여 다음에 만나는 노드의 부모값을 재귀함수에 넣어두면서 함꼐 갱신시키면 됩니다.
여기서, N의 크기는 100,000 (10^5) 십만 이기에 matrix 행렬로 그래프를 만들면 10^10 으로 메모리초과 256MB 를 초과하여 ArrayList<Integer>[] 형태로 만들어줍니다.
코드
코드입니다.
import java.util.ArrayList; import java.util.Scanner; public class Main { static boolean[] visited; static ArrayList<ArrayList<Integer>> graph = new ArrayList<ArrayList<Integer>>(); static int[] answer; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n=sc.nextInt(); visited = new boolean[n+1]; answer = new int[n+1]; for(int i=0;i<=n;i++) { graph.add(new ArrayList<Integer>()); } for(int i=1;i<n;i++) { int start = sc.nextInt(); int end = sc.nextInt(); graph.get(start).add(end); graph.get(end).add(start); } dfs(1, 1); for(int i=2;i<=n;i++) { System.out.println(answer[i]); } } static void dfs(int start, int parent) { visited[start] = true; answer[start] = parent; for(int i=0; i<graph.get(start).size();i++) { if(visited[graph.get(start).get(i)] == false) { dfs(graph.get(start).get(i), start); }else { continue; } } } }
정답코드 2입니다.
package Main; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.StringTokenizer; public class Main { static int N, C, H, W, K, M, T; static int answer = 0; static int[] parent; static ArrayList<Integer>[] arr; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); arr = new ArrayList[N]; for(int i=0;i<N; i++) { arr[i] = new ArrayList<Integer>(); } parent = new int[N]; for(int i=0;i<N-1; i++) { st = new StringTokenizer(br.readLine()); int u = Integer.parseInt(st.nextToken()) - 1; int v = Integer.parseInt(st.nextToken()) - 1; arr[u].add(v); arr[v].add(u); } DFS(0, -1, new boolean[N]); for(int i=1; i<N; i++) { System.out.println(parent[i] + 1); } } static void DFS(int now, int before, boolean[] visited) { parent[now] = before; for(int next = 0; next < arr[now].size(); next++) { int nextNode = arr[now].get(next); if(visited[nextNode] == false) { visited[nextNode] = true; DFS(nextNode, now, visited); } } } }
2차원 행렬로 받을경우 10^5 (십만) * 10^5 이기에 메모리초과가 발생합니다.
흠.. 256MB이기에 2^20 * 2^8 이 10^10 * 1 Byte 보다 작기에 메모리초과가 발생합니다.
package Main; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class Main { static int N, C, H, W, K, M, T; static int answer = 0; static int[] parent; static boolean[][] matrix; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); matrix = new boolean[N][N]; parent = new int[N]; for(int i=0;i<N-1; i++) { st = new StringTokenizer(br.readLine()); int u = Integer.parseInt(st.nextToken()) - 1; int v = Integer.parseInt(st.nextToken()) - 1; matrix[u][v] = true; matrix[v][u] = true; } DFS(0, -1, new boolean[N]); for(int i=1; i<N; i++) { System.out.println(parent[i] + 1); } } static void DFS(int now, int before, boolean[] visited) { parent[now] = before; for(int next=0; next<N; next++) { if(matrix[now][next] == true && visited[next] == false) { visited[next] = true; DFS(next, now, visited); } } } }
'알고리즘 > Tree' 카테고리의 다른 글
[백준] 1967 트리의 지름 - 골드4, DFS + 트리(Tree) 자바 (0) | 2023.01.13 |
---|---|
[백준] 나무 위의 빗물 - 골드5, 트리(Tree) (0) | 2023.01.12 |
[백준] 트리 - 골드5, 트리(Tree) (0) | 2023.01.12 |
[백준] 단절점과 단절선 - 실버1, 트리(Tree) (0) | 2023.01.12 |
[백준] 1991 트리 순회 - 실버1, 트리(Tree) + DFS (0) | 2023.01.11 |