LCA最近公共祖先

Posted zxz666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LCA最近公共祖先相关的知识,希望对你有一定的参考价值。

 不会 准备研究一波!!!

 1 #include<bits/stdc++.h>
 2 const int maxn = 500010;
 3 using namespace std;
 4 vector<int> g[maxn];
 5 int par[20][maxn], dep[maxn], n, m, ml;
 6 void dfs(int v, int p, int d)
 7 {
 8     par[0][v] = p;
 9     dep[v] = d;
10     for (int i = 0; i < g[v].size(); ++i){
11         if (g[v][i] != p) dfs(g[v][i], v, d + 1);
12     }
13     return ;
14 }
15 void init(int v)
16 {
17     dfs(v, -1, 0);
18     int sum = 1;
19     while (sum <= n) sum <<= 1, ++ml;
20     for (int k = 0; k < ml; ++k){
21         for (int v = 1; v <= n; ++v){
22             if (par[k][v] == -1) par[k + 1][v] = -1;
23             else par[k + 1][v] = par[k][par[k][v]];
24         }
25     }
26     return ;
27 }
28 int lca(int u, int v)
29 {
30     if (dep[u] > dep[v]) swap(u, v);
31     for (int k = 0; k < ml; ++k){
32         if (((dep[v] - dep[u]) >> k) & 1) v = par[k][v];
33     }
34     if (u == v) return u;
35     for (int k = ml; k >= 0; --k){
36         if (par[k][u] != par[k][v]) u = par[k][u], v = par[k][v];
37     }
38     return par[0][u];
39 }
40 int main()
41 {
42     int s, u, v;
43     scanf("%d %d %d", &n, &m, &s);
44     int t = n;
45     while (--t){
46         scanf("%d %d", &u, &v);
47         g[u].push_back(v);
48         g[v].push_back(u);
49     }
50     init(s);
51     while (m--){
52         scanf("%d %d", &u, &v);
53         printf("%d
", lca(u, v));
54     }
55     return 0;
56 }

 

以上是关于LCA最近公共祖先的主要内容,如果未能解决你的问题,请参考以下文章

二叉树最近公共祖先

二叉树最近公共祖先

最近公共祖先(LCA)问题

LCA —— 最近公共祖先

[转]LCA 最近公共祖先

LCA(最近公共祖先)