首页 > 其他 > 详细

倍增求LCA

时间:2017-01-25 17:30:37      阅读:181      评论:0      收藏:0      [点我收藏+]

LCA:(Least Common Ancestors),即最近公共祖先节点。

 1 const int maxn = 100003;
 2 const int maxl = 19;
 3 
 4 struct Edge {
 5     int t;
 6     Edge *ne;
 7 };
 8 
 9 int dep[maxn], up[maxn][maxl];
10 Edge *head[maxn];
11 
12 void DFS(int u) {
13     for (int i = 1; i < maxl; ++ i) {
14         up[u][i] = up[up[u][i - 1]][i - 1];
15     }
16     for (Edge* e = head[u]; e; e = e->ne) { // 枚举儿子
17         if (!dep[e->t]) {
18             dep[e->t] = dep[u] + 1;
19             up[e->t][0] = u;
20             DFS(e->t);
21         }
22     }
23 }
24 
25 int LCA(int u, int v) {
26     if (dep[u] < dep[v]) {
27         swap(u, v);
28     }
29     for (int i = maxl - 1; i >= 0; -- i) {
30         if (dep[up[u][i]] >= dep[v]) {
31             u = up[u][i];
32         }
33     }//保证深度相同 
34     if (u == v) {
35         return u;
36     }
37     for (int i = maxl - 1; i >= 0; -- i) {
38         if (up[u][i] != up[v][i]) {
39             u = up[u][i];
40             v = up[v][i];
41         }
42     }
43     return up[u][0];
44 }
45 
46 int main() {
47     memset(dep, -1, sizeof(dep));
48     dep[1] = 0;
49     up[1][0] = 0;
50     DFS(1);
51     while (q --) {
52         int u, v;
53         cin >> u >> v;
54         cout << LCA(u, v) << endl;
55     }
56 }

 

倍增求LCA

原文:http://www.cnblogs.com/9pounds15pence/p/6349679.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!