zoukankan      html  css  js  c++  java
  • LCA模板

    Description

    给出N,Q 
    代表一个树有N个点 ,树的根为1
    Q代表有Q个询问,询问A,B的最近公共祖先是哪一个.

    Input

    第一行给出N,Q 
    下面N-1行描述这个树,格式为A,B,代表A为B的Son 
    现来下Q行 
    给出A,B,代表进行询问A,B的LCA是哪一个.

    Output

    针对每个询问输出结果

    Sample Input

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

    Sample Output

    2
    2

    此题专供模板学习,以至于可以看懂后续的帖子。树上倍增是一种通过st表(稀疏表)记录,并不断以2倍的方式向上查找来求得最近公共祖先的算法。这里用f[n][k]来表示第n个点的第2^k个祖先(这里的^表示乘方)。

    代码

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 int son[100001],nex[100001],pre[100001],fa[100001],f[100001][20],n,m,a,b,root,deep[100001],tot;
     5 bool used[100001];
     6 void add(int x,int y)
     7 {
     8     tot++;
     9     son[tot]=y;
    10     nex[tot]=pre[x];
    11     pre[x]=tot;
    12 }
    13 void dfs(int now)
    14 {
    15     used[now]=1;
    16     for(int i=1;i<=19;i++)
    17     {
    18         if(deep[now]<(1<<i))break;
    19         f[now][i]=f[f[now][i-1]][i-1];
    20     }
    21     for(int i=pre[now];i;i=nex[i])
    22     {
    23         int k=son[i];
    24         if(used[k])continue;
    25         deep[k]=deep[now]+1;
    26         f[k][0]=now;
    27         dfs(k);
    28     }
    29 }
    30 int lca(int x,int y)
    31 {
    32     if(deep[x]>deep[y])swap(x,y);
    33     int poor=deep[y]-deep[x];
    34     for(int i=0;i<=19;i++)
    35         if((1<<i)&poor)
    36             y=f[y][i];
    37     for(int i=19;i>=0;i--)
    38         if(f[x][i]!=f[y][i])
    39             x=f[x][i],y=f[y][i];
    40     if(x==y)return x;
    41     return f[x][0];
    42 }
    43 int main()
    44 {
    45     scanf("%d%d",&n,&m);
    46     for(int i=1;i<=n-1;i++)
    47         scanf("%d%d",&a,&b),add(a,b),add(b,a);
    48     dfs(1);
    49     int begin,end;
    50     for(int i=1;i<=m;i++)
    51     {
    52         scanf("%d%d",&begin,&end);
    53         printf("%d
    ",lca(begin,end));
    54     }
    55 }
  • 相关阅读:
    ajax(读取json数据)
    MD5加密出现 无法启动:此实现不是Windows平台FIPS验证的加密算法的一部分
    二维码(android)
    电脑快捷键大全
    OkHttp
    HttpURLConnection 传输数据和下载图片
    子线程更新UI界面的2种方法
    URLConnection(互联网)
    点滴
    SQL 备忘录
  • 原文地址:https://www.cnblogs.com/lcxer/p/9441770.html
Copyright © 2011-2022 走看看