๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/11437)
< LCA >
๋ฌธ์ ํ์ด
๋ฃจํธ๋ 1๋ฒ์ด๋ฏ๋ก 1๋ฒ๋ถํฐ ์์ํด์ ๊ฐ ์ ์ ๊น์ง์ ๊น์ด์ ๋ถ๋ชจ ์ ์ ์ ๊ตฌํ๋ค. ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ ์๊ณ ์ถ์ ์์ ์ ๋ ฅ๋ฐ์ผ๋ฉด ๋จผ์ ์ ์ ๊น์ด๋ฅผ ๊ฐ์ ๊น์ด๋ก ๋ง์ถ๋ค. ๊น์ด๊ฐ ๊ฐ๋ค๋ฉด ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ๋ถ๋ชจ๋ฅผ ๊ตฌํ๋ค.
my solution (Java)
ver1.
๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ๋ถ๋ชจ๋ฅผ ๊ตฌํ ๋ ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํด์ ๊น์ด๊ฐ ๊น์ ๊ฒ ๋จผ์ ๋ถ๋ชจ๋ฅผ ์ฐพ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ค. ์ด ๊ฒฝ์ฐ 6992ms ์๊ฐ์ด ๊ฑธ๋ ธ๋ค..
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main { // LCA
static int depth[], n, parent[];
static ArrayList<ArrayList<Integer>> arr;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
n = Integer.parseInt(bf.readLine());
arr = new ArrayList<>();
depth = new int[n + 1];
parent = new int[n + 1];
for (int i = 0; i <= n; i++) {
arr.add(new ArrayList<>());
}
for (int i = 0; i < n - 1; i++) {
st = new StringTokenizer(bf.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
arr.get(a).add(b);
arr.get(b).add(a);
}
findDepth();
int m = Integer.parseInt(bf.readLine());
for (int i = 0; i < m; i++) {
st = new StringTokenizer(bf.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
bw.write(findParent(a, b) + "\n");
}
bw.flush();
}
private static int findParent(int a, int b) {
PriorityQueue<int[]> queue = new PriorityQueue<>(new Comparator<int[]>() { // ์ ์ ๋ฒํธ, ๊น์ด
@Override
public int compare(int[] o1, int[] o2) {
return o2[1] - o1[1];
}
});
queue.add(new int[] { a, depth[a], -1 });
queue.add(new int[] { b, depth[b], -2 });
int aParent = a;
int bParent = b;
while (!queue.isEmpty()) {
if (aParent == bParent) {
break;
}
int info[] = queue.poll();
int num = parent[info[0]];
if (info[2] == -1) {
aParent = num;
queue.add(new int[] { num, depth[num], -1 });
} else {
bParent = num;
queue.add(new int[] { num, depth[num], -2 });
}
}
return aParent;
}
private static void findDepth() {
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
boolean visited[] = new boolean[n + 1];
visited[1] = true;
while (!queue.isEmpty()) {
int info = queue.poll();
for (int i = 0; i < arr.get(info).size(); i++) {
if (!visited[arr.get(info).get(i)]) {
visited[arr.get(info).get(i)] = true;
parent[arr.get(info).get(i)] = info;
depth[arr.get(info).get(i)] = depth[info] + 1;
queue.add(arr.get(info).get(i));
}
}
}
}
}
์ต์ข ver.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class _11437_ { // LCA
static int depth[], n, parent[];
static ArrayList<ArrayList<Integer>> arr;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
n = Integer.parseInt(bf.readLine());
arr = new ArrayList<>();
depth = new int[n + 1];
parent = new int[n + 1];
for (int i = 0; i <= n; i++) {
arr.add(new ArrayList<>());
}
for (int i = 0; i < n - 1; i++) {
st = new StringTokenizer(bf.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
arr.get(a).add(b);
arr.get(b).add(a);
}
findDepth();
int m = Integer.parseInt(bf.readLine());
for (int i = 0; i < m; i++) {
st = new StringTokenizer(bf.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
bw.write(findParent(a, b) + "\n");
}
bw.flush();
}
private static int findParent(int a, int b) {
int aParent = a;
int bParent = b;
while (aParent != bParent) {
if (depth[aParent] > depth[bParent]) {
aParent = parent[aParent];
} else if (depth[aParent] < depth[bParent]) {
bParent = parent[bParent];
} else {
aParent = parent[aParent];
bParent = parent[bParent];
}
}
return aParent;
}
private static void findDepth() {
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
boolean visited[] = new boolean[n + 1];
visited[1] = true;
while (!queue.isEmpty()) {
int info = queue.poll();
for (int i = 0; i < arr.get(info).size(); i++) {
int num = arr.get(info).get(i);
if (!visited[num]) {
visited[num] = true;
parent[num] = info;
depth[num] = depth[info] + 1;
queue.add(num);
}
}
}
}
}
๋ณ์)
n : ๋ ธ๋์ ๊ฐ์
arr : ๊ทธ๋ํ
depth : ๋ ธ๋ ๊น์ด
parent : ๋ ธ๋ ๋ถ๋ชจ
m : ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ ์๊ณ ์ถ์ ์์ ๊ฐ์
ํธ๋ฆฌ ์์ ์ฐ๊ฒฐ๋ ๋ ์ ์ ์ ์ ๋ ฅ๋ฐ์ arr์ ์๋ฐฉํฅ์ผ๋ก ์ ์ฅํ๋ค. findDepth ํจ์๋ฅผ ํตํด ๋ฃจํธ๋ถํฐ ๊น์ด์, ๋ถ๋ชจ๋ฅผ ๊ตฌํ๋ค. ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ ์๊ณ ์ถ์ ์์ ๊ฐ์๋ฅผ ์ ๋ ฅ๋ฐ์ ํ ๊ทธ ์๋งํผ ์์ ์ ๋ ฅ๋ฐ์ findParent ํจ์๋ฅผ ํตํด ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ ์ถ๋ ฅํ๋ค.
findDepth
queue์ ๋ฃจํธ ๋ ธ๋ 1์ ๋ฃ๊ณ ์์ํ๋ค. ๋ฐฉ๋ฌธ ๋ฐฐ์ด๋ ์ ์ธํ์ฌ ๋ฃจํธ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ๋ค.
queue๊ฐ ๋น ๋๊น์ง ๋ค์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
1) queue poll
2) ๊ทธ๋ํ๋ฅผ ํตํด ์ฐ๊ฒฐ๋ ๋ ธ๋ ํ์
3) ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ผ๋ฉด ๋ฐฉ๋ฌธ ํ์ ๋ฐ ๊น์ด๋ฅผ [ํ์ฌ ๊น์ด+1]๋ก ์ ์ฅ, ๋ถ๋ชจ๋ฅผ [๋ค์ ๋ ธ๋์ ๋ถ๋ชจ]=[ํ์ฌ ๋ ธ๋]๋ก ์ ์ฅ, queue์ ๋ค์ ๋ ธ๋๋ฅผ ์ ์ฅํ๋ค.
findParent(๋ ธ๋ a, ๋ ธ๋ b)
a์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ a๋ก, b์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ b๋ก ์ด๊ธฐํํ๋ค. ๋ ๋ ธ๋์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ด ๊ฐ์์ง ๋๊น์ง ๋ค์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
1) a์ ๊น์ด๊ฐ ๋ ํฌ๋ค๋ฉด ๊น์ด๋ฅผ ๋ง์ถ๊ธฐ ์ํด a์ ๋ถ๋ชจ๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
2) b์ ๊น์ด๊ฐ ๋ ํฌ๋ค๋ฉด ๊น์ด๋ฅผ ๋ง์ถ๊ธฐ ์ํด b์ ๋ถ๋ชจ๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
3) a์ b์ ๊น์ด๊ฐ ๊ฐ๋ค๋ฉด ๋ ๋ค ๋ถ๋ชจ๊ฐ ๊ฐ์์ง ๋๊น์ง ์ ๋ฐ์ดํธํ๋ค.
a์ b์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ ์ฐพ์๋ค๋ฉด ๊ฐ์ ๋ฐํํ๋ค.

'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 3005_ํฌ๋ก์ค์๋ ํผ์ฆ ์ณ๋ค๋ณด๊ธฐ (0) | 2024.02.22 |
---|---|
[Baekjoon] 1706_ํฌ๋ก์ค์๋ (0) | 2024.02.20 |
[Baekjoon] 8911_๊ฑฐ๋ถ์ด (1) | 2024.02.16 |
[Baekjoon] 1918_ํ์ ํ๊ธฐ์ (0) | 2024.02.15 |
[Baekjoon] 6986_์ ์ฌํ๊ท (1) | 2024.02.14 |