Skip to content

Commit 29c5a11

Browse files
authored
Created LCA
1 parent dd60480 commit 29c5a11

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

Data Structures/LCA/lca.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#include <stdio.h>
2+
#include <vector>
3+
using namespace std;
4+
#define max 100
5+
#define lg_max 7
6+
vector<int> graph[max];
7+
int parent[max][lg_max], level[max], lg[max];
8+
int n;
9+
void log(){
10+
for(int i=2; i<max; i++) lg[i] = lg[i/2] + 1;
11+
}
12+
void dfs(int u, int p){
13+
for(auto v: graph[u]){
14+
if(v != p){
15+
level[v] = level[u] + 1;
16+
parent[v][0] = u;
17+
dfs(v,u);
18+
}
19+
}
20+
}
21+
void build(){
22+
for(int j=1; j<=lg[n]; j++){
23+
for(int i=1; i<=n; i++){
24+
parent[i][j] = parent[parent[i][j-1]][j-1];
25+
}
26+
}
27+
}
28+
int lca(int u, int v){
29+
if(level[u] < level[v]) return lca(v, u);
30+
for(int i=lg[n]; i>=0; i--){
31+
if(level[u] - (1<<i) >= level[v]){
32+
u = parent[u][i];
33+
}
34+
}
35+
if(u == v) return u;
36+
for(int i=lg[n]; i>=0; i--){
37+
if(parent[u][i] != parent[v][i]){
38+
u = parent[u][i];
39+
v = parent[v][i];
40+
}
41+
}
42+
return parent[u][0];
43+
}
44+
int main(){
45+
log();
46+
int x, y;
47+
scanf("%d", &n);
48+
for(int i=0; i<n-1; i++){
49+
scanf("%d%d", &x, &y);
50+
graph[x].push_back(y);
51+
graph[y].push_back(x);
52+
}
53+
dfs(1,1);
54+
build();
55+
scanf("%d%d", &x, &y);
56+
printf("%d\n", lca(x, y));
57+
}

0 commit comments

Comments
 (0)