File tree Expand file tree Collapse file tree 1 file changed +57
-0
lines changed Expand file tree Collapse file tree 1 file changed +57
-0
lines changed Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments