๋ฌธ์
https://www.acmicpc.net/problem/11437
๋ฌธ์ ํ์ด
DFS๋ก parent/depth ์ ์ฅ → ๊น์ด ๋ง์ถ๊ธฐ → ํจ๊ป ์ฌ๋ผ๊ฐ๋ฉด์ ๊ฐ์์ง๋ ์ง์ ๋ฐํ
- ํธ๋ฆฌ DFS๋ก ๊ฐ ๋ ธ๋์ ๋ถ๋ชจ, ๊น์ด ์ ์ฅํ๊ธฐ
- ๋ฃจํธ๋ถํฐ ์์์ผ๋ก ๋ด๋ ค๊ฐ๋ฉด์
parent,depth๋ฐฐ์ด์ ์ ์ฅ - ๋ฃจํธ(1)๋ ๋ถ๋ชจ๋ฅผ ์๊ธฐ ์์ (1)์ผ๋ก, ๊น์ด๋ 0์ผ๋ก (
dfs(1, 1, 0))
- LCA ๊ตฌํ๊ธฐ
- ๊น์ด ๋ง์ถ๊ธฐ
- ๋ ๊น์ ์ชฝ์ ๋ถ๋ชจ๋ก ์ฌ๋ ค์
depth[a] == depth[b]๋ก ๋ง๋ฆ.
- ๋ ๊น์ ์ชฝ์ ๋ถ๋ชจ๋ก ์ฌ๋ ค์
- ๊ณตํต ์กฐ์ ์ฐพ๊ธฐ
a == b๊ฐ ๋ ๋๊น์ง ๋ ๋คparent๋ก ์ฌ๋ผ๊ฐ.- ๊ฐ์์ง๋ฉด ๊ทธ ๋ ธ๋๊ฐ LCA.
์ ์ํ ์ (์์ธ)
a, b๊ฐ ๊ฐ์ ๋
ธ๋์ด๊ฑฐ๋, ํ์ชฝ์ด ๋ค๋ฅธ ์ชฝ์ ์กฐ์์ผ ์ ์๋ค.
์ด๋ LCA๋ ๊ทธ ๋
ธ๋ ์์ ์ด์ด์ผ ํ๋ค.
์๋ชป๋ ์ฝ๋
while (parent[a] != parent[b]) {
a = parent[a];
b = parent[b];
}
return parent[a]; // ๋ถ๋ชจ๋ฅผ ๋ฐํ
๊ณตํต ๋ถ๋ชจ๋ฅผ ์ฐพ๋ ๊ฒ์ด๋ผ์ a, b์ ๋ถ๋ชจ๊ฐ ๊ฐ์ ๋๊น์ง ์ฌ๋ผ๊ฐ๊ณ ๊ฐ์ผ๋ฉด ๋ถ๋ชจ๋ฅผ ๋ฐํํ๋ค.
์ด๋ด ๊ฒฝ์ฐ, ๊น์ด๋ฅผ ๋ง์ถ ํ์ ๋ ๋
ธ๋๊ฐ ๊ฐ์ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๋ ๋
ธ๋์ ๋ถ๋ชจ๋ฅผ ๋ฐํ → ํ ๋จ๊ณ ๋ ์ฌ๋ผ๊ฐ ๊ฐ์ ๋ฐํํด์ ์ค๋ต์ด ์ถ๋ ฅ๋๋ค.
์์ ํ ์ฝ๋
while (a != b) {
a = parent[a];
b = parent[b];
}
return a;
์ฝ๋
import java.util.*;
import java.io.*;
public class Main {
static int n;
static int[] parent;
static int[] depth;
static List<Integer>[] edge;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine()); // ๋
ธ๋ ๊ฐ์
parent = new int[n + 1];
depth = new int[n + 1];
edge = new ArrayList[n + 1];
for (int i = 0; i <= n; i++) {
edge[i] = new ArrayList<>();
}
for (int i = 0; i < n - 1; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
edge[a].add(b);
edge[b].add(a);
} // ์
๋ ฅ1 ๋
dfs(1, 1, 0); // ๋ถ๋ชจ, ๊น์ด ์ ์ฅ
StringBuilder sb = new StringBuilder();
int m = Integer.parseInt(br.readLine());
while (m-- > 0) {
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
sb.append(lca(a, b)).append("\n");
} // ์
๋ ฅ2 & ์ฐ์ฐ
System.out.println(sb);
}
static void dfs(int cur, int p, int d) {
parent[cur] = p;
depth[cur] = d;
for (int next : edge[cur]) {
if (next == p)
continue;
dfs(next, cur, d + 1);
}
}
static int lca(int a, int b) {
// ๊น์ด ๋ง์ถ๊ธฐ
while (depth[a] < depth[b])
b = parent[b];
while (depth[a] > depth[b])
a = parent[a];
// ๊ณตํต ์กฐ์ ์ฐพ๊ธฐ
while (a != b) {
a = parent[a];
b = parent[b];
}
return a;
}
}'๐ญ Problem Solving > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [BOJ][Java] 18808. ์คํฐ์ปค ๋ถ์ด๊ธฐ (0) | 2025.11.08 |
|---|---|
| [BOJ][Java] 21608. ์์ด ์ด๋ฑํ๊ต (3) | 2025.10.21 |
| [BOJ][Java] 20056. ๋ง๋ฒ์ฌ ์์ด์ ํ์ด์ด๋ณผ (0) | 2025.10.15 |
| [BOJ][Java] 16236. ์๊ธฐ ์์ด (0) | 2025.10.01 |
| [BOJ][Java] 2533. ์ฌํ๋ง ์๋น์ค(SNS) (0) | 2025.09.24 |