zoukankan      html  css  js  c++  java
  • 【luogu P3379 最近公共祖先】 模板

    题目链接:https://www.luogu.org/problemnew/show/P3379

    倍增求lca,先存下板子,留个坑以后再填讲解。

    in

    5 5 4
    3 1
    2 4
    5 1
    1 4
    2 4
    3 2
    3 5
    1 2
    4 5

    out

    4
    4
    1
    4
    4

      1 #include <cstdio>
      2 #include <iostream>
      3 #include <algorithm>
      4 #include <cstring>
      5 using namespace std;
      6 const int maxlog = 20;
      7 const int maxn = 550000;
      8 int n, m, s;
      9 int root;
     10 int fa[maxn][maxlog];
     11 int deep[maxn];
     12 int head[maxn];
     13 int cnt;
     14 struct Edge{
     15     int next;
     16     int to;
     17 }e[2 * maxn];
     18 void add(int u, int v)
     19 {
     20     e[cnt].to = v;
     21     e[cnt].next = head[u];
     22     head[u] = cnt++;
     23 }
     24 void dfs(int u, int p, int d)
     25 {
     26     fa[u][0] = p;
     27     deep[u] = d;
     28     for(int i = head[u]; i != -1; i = e[i].next)
     29         if(e[i].to != p) dfs(e[i].to, u, d+1);
     30 }
     31 void init()
     32 {
     33     dfs (root, -1, 0);
     34     for(int k = 0; k + 1 < maxlog; k++)
     35     {
     36         for(int v = 1; v <= n; v++)
     37         if(fa[v][k] < 0) fa[v][k+1] = -1;
     38         else fa[v][k+1] = fa[fa[v][k]][k];
     39     }
     40 }
     41 int lca(int u, int v)
     42 {
     43     if(deep[u] > deep[v]) swap(u, v);
     44     for(int k = 0; k < maxlog; k++)
     45     {
     46         if((deep[v] - deep[u]) >> k & 1)
     47         v = fa[v][k];
     48     }
     49     if(u == v) return u;
     50     for(int k = maxlog - 1; k >= 0; k--)
     51     {
     52         if(fa[v][k] != fa[u][k])
     53         {
     54             u = fa[u][k];
     55             v = fa[v][k];
     56         }
     57     }
     58     return fa[u][0];
     59 }
     60 int main()
     61 {
     62     memset(head,-1,sizeof(head)); 
     63     int a,b;
     64     scanf("%d%d%d",&n,&m,&root);
     65     for(int i = 1; i < n; i++)
     66     {
     67         scanf("%d%d",&a,&b);
     68         add(a,b);
     69         add(b,a);
     70     }
     71     init();
     72     for(int i = 1; i <= m; i++)
     73     {
     74         int u,v,a;
     75         scanf("%d%d",&u,&v);
     76         a = lca(u,v);
     77         printf("%d
    ",a);
     78     }
     79     return 0;    
     80 }
     81 /*
     82 in:
     83 9 5 1
     84 1 2
     85 1 3
     86 2 5
     87 2 4
     88 3 6
     89 7 9
     90 6 7
     91 6 8
     92 9 8
     93 9 5
     94 6 5
     95 4 3
     96 4 5
     97 out:
     98 6
     99 1
    100 1
    101 1
    102 2
    103 */

    隐约雷鸣,阴霾天空,但盼风雨来,能留你在此。

    隐约雷鸣,阴霾天空,即使天无雨,我亦留此地。

  • 相关阅读:
    圣杯布局(定宽与自适应)
    【转载】jQuery插件开发精品教程,让你的jQuery提升一个台阶
    DOM 事件深入浅出(一)
    匿名类型
    类和结构
    C#预处理器指令
    Main()方法
    枚举
    预定义数据类型
    C#语言
  • 原文地址:https://www.cnblogs.com/MisakaAzusa/p/8551889.html
Copyright © 2011-2022 走看看