Skip to content

Commit fa1add2

Browse files
committed
Merge remote-tracking branch 'origin/master'
2 parents 2f742cc + 56946b6 commit fa1add2

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package main.java.videos;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
7+
public class LCA {
8+
private static int adj[][];
9+
private static int V;
10+
private static int parent[];
11+
12+
private static int log(int N) {
13+
return 31 - Integer.numberOfLeadingZeros(N);
14+
}
15+
16+
private static void findAncestors(final int DP[][]) {
17+
System.arraycopy(parent, 1, DP[0], 1, V);
18+
for (int i = 1; i < DP.length; i++) {
19+
for (int j = 1; j <= V; j++) {
20+
DP[i][j] = DP[i - 1][DP[i - 1][j]];
21+
}
22+
}
23+
}
24+
25+
private static int lca(int u, int v, int DP[][], int level[]) {
26+
if (level[v] < level[u]) {
27+
int temp = u;
28+
u = v;
29+
v = temp;
30+
}
31+
int diff = level[v] - level[u];
32+
while (diff > 0) {
33+
int log = log(diff);
34+
v = DP[log][v];
35+
diff -= (1 << log);
36+
}
37+
while (u != v) {
38+
int i = log(level[u]);
39+
for (; i > 0 && DP[i][u] == DP[i][v]; )
40+
i--;
41+
42+
u = DP[i][u];
43+
v = DP[i][v];
44+
}
45+
return u;
46+
}
47+
48+
private static void dfs(final int u, final int par, final int lev, int level[]) {
49+
parent[u] = par;
50+
level[u] = lev;
51+
for (int v : adj[u]) {
52+
if (v != par) {
53+
dfs(v, u, lev + 1, level);
54+
}
55+
}
56+
}
57+
58+
public static void main(final String args[]) throws IOException {
59+
final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
60+
V = Integer.parseInt(bufferedReader.readLine());
61+
int E = V - 1;
62+
final int from[] = new int[E];
63+
final int to[] = new int[E];
64+
while (E-- > 0) {
65+
from[E] = Integer.parseInt(bufferedReader.readLine());
66+
to[E] = Integer.parseInt(bufferedReader.readLine());
67+
}
68+
adj = getAdjacencyList(V, from, to);
69+
final int[] level = new int[V + 1];
70+
final int DP[][] = new int[log(V) + 1][V + 1];
71+
parent = new int[V + 1];
72+
dfs(1, 0, 0, level);
73+
findAncestors(DP);
74+
//find lca of 0 and 0
75+
lca(0, 0, DP, level);
76+
}
77+
78+
private static int[][] getAdjacencyList(int n, int[] from, int[] to) {
79+
final int[][] lists = new int[n + 1][];
80+
final int[] adjacent = new int[n + 1];
81+
for (final int f : from) {
82+
adjacent[f]++;
83+
}
84+
for (final int t : to) {
85+
adjacent[t]++;
86+
}
87+
for (int i = 1; i < n + 1; i++) {
88+
lists[i] = new int[adjacent[i]];
89+
}
90+
for (int i = 0; i < from.length; i++) {
91+
lists[from[i]][--adjacent[from[i]]] = to[i];
92+
lists[to[i]][--adjacent[to[i]]] = from[i];
93+
}
94+
return lists;
95+
}
96+
}

0 commit comments

Comments
 (0)