zoukankan      html  css  js  c++  java
  • 倍增法求LCA

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<vector>
     5 #include<set>
     6 #include<map>
     7 #include<queue>
     8 using namespace std;
     9 #define INF 0x3f3f3f3f
    10 #define M(a, b) memset(a, b, sizeof(a))
    11 const int N = 1e4 + 10, M = 20;
    12 int deep[N], p[N][25];
    13 vector<int> G[N];
    14 
    15 void dfs(int u, int fa) {    
    16     for (int i = 1; i <= M; ++i)
    17         p[u][i] = p[p[u][i-1]][i-1];
    18     for (int i = 0; i < G[u].size(); ++i) {
    19         int v = G[u][i];
    20         if (v == fa || deep[v]) continue;
    21         deep[v] = deep[u] + 1;
    22         p[v][0] = u;
    23         dfs(v, u);
    24     }
    25 }
    26 
    27 int lca(int a, int b) {
    28     if (deep[a] < deep[b]) swap(a, b);
    29     for (int det = deep[a]-deep[b], i = 0; det; det >>= 1, ++i)
    30         if (det & 1) a = p[a][i];
    31     if (a == b) return a;
    32     for (int i = M-1; i >= 0; --i) {
    33         if (p[a][i] == p[b][i]) continue;
    34         a = p[a][i];
    35         b = p[b][i];
    36     }
    37     return p[a][0];
    38 }
    View Code
  • 相关阅读:
    js返回到顶部
    css培训一
    css常用hack技巧
    css培训二
    css样式渲染规则
    html语义(一)
    css样式表管理
    html+css培训方案
    继承
    封装
  • 原文地址:https://www.cnblogs.com/robin1998/p/6751867.html
Copyright © 2011-2022 走看看