728x90
[Java] 백준 11437 LCA
문제
N(2 ≤ N ≤ 50,000)개의 정점으로 이루어진 트리가 주어진다. 트리의 각 정점은 1번부터 N번까지 번호가 매겨져 있으며, 루트는 1번이다.
두 노드의 쌍 M(1 ≤ M ≤ 10,000)개가 주어졌을 때, 두 노드의 가장 가까운 공통 조상이 몇 번인지 출력한다.
입력
첫째 줄에 노드의 개수 N이 주어지고, 다음 N-1개 줄에는 트리 상에서 연결된 두 정점이 주어진다. 그 다음 줄에는 가장 가까운 공통 조상을 알고싶은 쌍의 개수 M이 주어지고, 다음 M개 줄에는 정점 쌍이 주어진다.
출력
M개의 줄에 차례대로 입력받은 두 정점의 가장 가까운 공통 조상을 출력한다.
제출
import java.util.*;
public class Main {
static ArrayList<Integer>[] tree;
static int[] depth;
static int[] parent;
static boolean[] visited;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
tree = new ArrayList[N + 1];
for (int i = 1; i <= N; i++) {
tree[i] = new ArrayList<Integer>();
}
for (int i = 0; i < N - 1; i++) {
int s = sc.nextInt();
int e = sc.nextInt();
tree[s].add(e);
tree[e].add(s);
}
depth = new int[N + 1];
parent = new int[N + 1];
visited = new boolean[N + 1];
BFS(1);
int M = sc.nextInt();
for (int i = 0; i < M; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
int LCA = excuteLCA(a, b);
System.out.println(LCA);
}
}
static int excuteLCA(int a, int b) {
if (depth[a] < depth[b]) {
int temp = a;
a = b;
b = temp;
}
while (depth[a] != depth[b]) {
a = parent[a];
}
while (a != b) {
a = parent[a];
b = parent[b];
}
return a;
}
private static void BFS(int node) {
Queue<Integer> queue = new LinkedList<Integer>();
queue.add(node);
visited[node] = true;
int level = 1;
int now_size = 1;
int count = 0;
while (! queue.isEmpty()) {
int now_node = queue.poll();
for (int next : tree[now_node]) {
if (!visited[next]) {
visited[next] = true;
queue.add(next);
parent[next] = now_node;
depth[next] = level;
}
}
count++;
if (count == now_size) {
count = 0;
now_size = queue.size();
level++;
}
}
}
}
예제
15
1 2
1 3
2 4
3 7
6 2
3 8
4 9
2 5
5 11
7 13
10 4
11 15
12 5
14 7
6
6 11
10 9
2 6
7 6
8 13
8 15
결과
728x90
'JAVA > 백준' 카테고리의 다른 글
[Java] 백준 11050 이항 계수 1 - 조합 알아보기(1) (0) | 2022.12.28 |
---|---|
[Java] 백준 11438 LCA 2 - 최소 공통 조상(2) (0) | 2022.12.27 |
[Java] 백준 11505 구간 곱 구하기 - 세그먼트 트리(3) (0) | 2022.12.25 |
[Java] 백준 10868 최솟값 - 세그먼트 트리(2) (0) | 2022.12.24 |
[Java] 백준 2042 구간 합 구하기 - 세그먼트 트리(1) (0) | 2022.12.23 |
댓글