๐ ๋ฌธ์
https://www.acmicpc.net/problem/11437
๐ ์์ด๋์ด
๊ณตํต ์กฐ์์ ์ฐพ๋ ๋ฌธ์ ์ ๋๋ค.
๊ฐ ๋ ธ๋์ ๊น์ด๋ฅผ ๋จผ์ BFS, DFS๋ฅผ ์ด์ฉํ์ฌ ๊ณ์ฐํฉ๋๋ค. (์ด๋ ๋ถ๋ชจ ๋ ธ๋๋ ํจ๊ป ์ง์ ํด์ค๋๋ค, parents ๋ฐฐ์ด)
์ดํ์ a,b ๋ ธ๋์ ๊ณตํต ์กฐ์์ ์ฐพ๋ ๊ฒฝ์ฐ a์ ๊น์ด, b์ ๊น์ด๋ฅผ ๋น๊ตํ์ฌ ๋ ๋ ธ๋์ ๊น์ด๊ฐ ๋์ผํ ๋๊น์ง ๋ถ๋ชจ๋ก ์ด๋ํ๋ฉฐ ์ฌ๋ผ์ต๋๋ค
๋ ๋ ธ๋์ ๊น์ด๊ฐ ๊ฐ์์ก์ผ๋ฉด ๋ ๋ ธ๋๋ฅผ ํจ๊ป ๋ถ๋ชจ๋ก ๋ ธ๋๋ก ์ฌ๋ฆฌ๋๊ฒ์ ๋ฐ๋ณตํฉ๋๋ค. ํด๋น ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค ๋์ผ ๋ ธ๋๊ฐ ๋๋ฉด ํด๋น ๋ ธ๋๊ฐ ๊ณตํต ๋ถ๋ชจ ๋ ธ๋์ ๋๋ค.
์ฐธ๊ณ ๋ก ํด๋น๋ฌธ์ ๋ ๋์ฑ ์ต์ ํํ ์ ์์ด ํ๋ ํฐ๋ 5๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ฃผ์ํด์ผ ํ ์ ์ ๋ถ๋ชจ ๋ ธ๋๊ฐ ๋ฐ๋์ ์ ์ ์ซ์์ธ ๊ฒ์ด ์๋๋ผ๋ ๊ฒ์ ๋๋ค.
์ฆ ์๋์ ๊ฐ์ ๊ฒฝ์ฐ๋ ์์ ์ ์๊ธฐ ๋๋ฌธ์ parents๋ฐฐ์ด์ bfs/dfs ํ์ํ๋ฉด์ ์ฑ์์ฃผ์ด์ผ ์ ํํ ๊ฐ์ ๊ตฌํด์ค ์ ์์ต๋๋ค.
๐ ํ์ด
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Boj_11437_LCA {
private static int[] depths;
private static int[] parents;
private static final List<List<Integer>> graph = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int nodeCnt = Integer.parseInt(br.readLine());
//๋ถ๋ชจ ๋
ธ๋๋ฅผ ์ ๋๋ค.
parents = new int[nodeCnt];
for (int i = 0; i < nodeCnt; i++) {
graph.add(new ArrayList<>());
}
for (int i = 0; i < nodeCnt - 1; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken()) - 1;
int b = Integer.parseInt(st.nextToken()) - 1;
graph.get(a).add(b);
graph.get(b).add(a);
}
//๊ฐ ์ ์ ์ ๊น์ด๋ฅผ ๊ตฌํ๋ค.
depths = new int[nodeCnt];
bfs();
//๋ ์ ์ ์ ๊ฐ์ ๋
ธ๋ ๊ตฌํ๋ค.
int tc = Integer.parseInt(br.readLine());
for (int i = 0; i < tc; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken()) - 1;
int b = Integer.parseInt(st.nextToken()) - 1;
sb.append(lca(a, b)).append("\n");
}
System.out.println(sb);
}
private static int lca(int a, int b) {
//์ผ๋จ ๋ ๊น์ด๊ฐ ๊ฐ์ ์ง๋๊น์ง ๋์ด์ฌ๋ฆฐ๋ค.
if (depths[a] > depths[b]) {
//a๋ฅผ ๋์ด ์ฌ๋ฆฐ๋ค.
while (depths[a] != depths[b]) {
a = parents[a];
}
} else if (depths[a] < depths[b]) {
//b๋ฅผ ๋์ด ์ฌ๋ฆฐ๋ค.
while (depths[a] != depths[b]) {
b = parents[b];
}
}
//๋ ๋
ธ๋๋ฅผ ๊ฐ์ด ์ฌ๋ฆฐ๋ค.
while (a != b) {
a = parents[a];
b = parents[b];
}
return a + 1;
}
private static void bfs() {
Queue<Integer> q = new LinkedList<>();
q.add(0);
int level = 1;
depths[0] = level;
parents[0] = 0;
while (!q.isEmpty()) {
level++;
int size = q.size();
for (int i = 0; i < size; i++) {
Integer parent = q.poll();
for (Integer child : graph.get(parent)) {
if (depths[child] == 0) { //๋ฐฉ๋ฌธํ์ง ์์ ๊ฒฝ์ฐ๋ง ๋ฐฉ๋ฌธํ๋ค
depths[child] = level;
parents[child] = parent;
q.add(child);
}
}
}
}
}
}
'๋ฐฑ์ค(boj)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA]13418 ํ๊ต ํ๋ฐฉํ๊ธฐ, ๊ณจ๋ 3 (0) | 2023.08.21 |
---|---|
[JAVA]5427 ๋ถ ๊ณจ๋4 (0) | 2023.08.21 |
[JAVA]2531 ํ์ ์ด๋ฐฅ (0) | 2023.08.10 |
[JAVA]2230 ์ ๊ณ ๋ฅด๊ธฐ, ํฌ ํฌ์ธํฐ(๊ณจ๋5) (0) | 2023.08.09 |
[JAVA]11780 ํ๋ก์ด๋, ํ๋ก์ด๋ ์์ (1) | 2023.08.09 |